Чтение онлайн

ЖАНРЫ

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

do

echo $user

done

# Спсибо Oleg Philon за этот пример.

cut -d ' ' -f2,3 filename эквивалентно awk -F'[ ]' '{ print $2, $3 }' filename

См. также Пример 12-33.

paste

Используется для объединения нескольких файлов в один многоколоночный файл.

join

Может рассматриваться как команда, родственная команде paste. Эта мощная утилита позволяет объединять

два файла по общему полю, что представляет собой упрощенную версию реляционной базы данных.

Команда join оперирует только двумя файлами и объедияет только те строки, которые имеют общее поле (обычно числовое), результат объединения выводится на stdout. Объединяемые файлы должны быть отсортированы по ключевому полю.

File: 1.data

100 Shoes

200 Laces

300 Socks

File: 2.data

100 $40.00

200 $1.00

300 $2.00

bash$ join 1.data 2.data

File: 1.data 2.data

100 Shoes $40.00

200 Laces $1.00

300 Socks $2.00

На выходе ключевое поле встречается только один раз.

head

Выводит начальные строки из файла на stdout (по-умолчанию -- 10 строк, но это число можно задать иным). Эта команда имеет ряд интересных ключей.

Пример 12-9. Какие из файлов являются сценариями?

#!/bin/bash

# script-detector.sh: Отыскивает файлы сценариев в каталоге.

TESTCHARS=2 # Проверяются первые два символа.

SHABANG='#!' # Сценарии как правило начинаются с "sha-bang."

for file in * # Обход всех файлов в каталоге.

do

if [[ `head -c$TESTCHARS "$file"` = "$SHABANG" ]]

# head -c2 #!

# Ключ '-c' в команде "head" выводит заданное

#+ количество символов, а не строк.

then

echo "Файл \"$file\" -- сценарий."

else

echo "Файл \"$file\" не является сценарием."

fi

done

exit 0

Пример 12-10. Генератор 10-значных

случайных чисел

#!/bin/bash

# rnd.sh: Генератор 10-значных случайных чисел

# Автор: Stephane Chazelas.

head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p'

# =================================================================== #

# Описание

# --------

# head:

# -c4 -- первые 4 байта.

# od:

# -N4 ограничивает вывод 4-мя байтами.

# -tu4 беззнаковый десятичный формат вывода.

# sed:

# -n, в комбинации с флагом "p", в команде "s",

# выводит только совпадающие с шаблоном строки.

# Автор сценария описывает действия 'sed' таким образом:

# head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p'

# ----------------------------------> |

# Передает вывод в "sed" --------> |

# пусть это будет 0000000 1198195154\n

# sed начинает читать символы: 0000000 1198195154\n.

# Здесь он находит символ перевода строки,

# таким образом он получает строку (0000000 1198195154).

# Затем он просматривает <диапазон><действие>. Первый и единственный -- это

# диапазон действие

# 1 s/.* //p

# Номер строки попадает в заданный лиапазон, так что теперь он приступает к выполнению действия:

# пытается заменить наибольшую подстроку, заканчивающуюся пробелом

# ("0000000 ") "ничем" (//), и если замена произведена -- выводит результат

# ("p" -- это флаг команды "s", а не команда "p", которая имеет иное значение).

# теперь sed готов продолжить чтение входного потока. (Обратите внимание:

# если опустить ключ -n, то sed выведет строку еще раз)

# Теперь sed дочитывает остаток строки.

# Он готов приступить к анализу 2-й строки (которая отмечена '$'

# как последняя).

# Поскольку строка не попадает в заданный <диапазон>, на этом обработка прекращается.

Поделиться с друзьями: