Приемы профессиональной работы в UNIX


КОМАНДА cut ДЛЯ BSD


В системе BSD нет команды cut, но следующий командный файл все же "вырезает" первое непустое поле в текущем аргументе. Предположим, мы используем команду для генерации целого набора строк. В данном случае это команда who:

for NAME in 'who | sed "s/^\([^ ]*\).*/\1/"' do done

Для каждой обнаруженной строки (аргумента) команда sed должна подставить вторую строку символов вместо первой строки. Первая строка - это строка, которая вырезается. Мы ищем от начала строки (^) символ, отличный от пробела ([^ ]), за которым следует любое число непустых символов (*). Эта операция прерывается по достижении пробела. Набор непустых символов ограничивается обратными косыми чертами \( и \). Впоследствии ссылка на этот набор дается в виде \1. Символы .* означают, что после того, как найден пробел, необходимо считать подходящими все символы до конца строки. Мы находимся фактически сразу после того, что заключено в пару символов \( и \). Группируя первый набор символов, отличных от пробела, мы получаем то, что является результатом работы команды "cut -f1".

В этом месте мы подходим к знакам ударения (`), окаймляющим все выражение. Они берут результат работы всех команд, заключенных в знаки ударения и передают на следующую охватывающую структуру в наших вложенных выражениях. Этот следующий уровень окаймления указан кавычками. Кавычки превращают символ в строку, чтобы его можно было сравнить с символом "-". Следующий слой - квадратные скобки, указывающие условие для оператора if. Это приводит к тому, что генерируется нулевое (истина) или ненулевое (ложь) условие, которое управляет тем, будет ли выполнена часть then оператора if-then.

Мы не собираемся подробно анализировать много строк данного командного файла, но мы хотим показать вам, как читать выражение или всю строку текста программы так, чтобы это имело смысл.

Остальная часть командного файла представляет собой один огромный оператор выбора (case). Аргументом, используемым для ветвления, является число позиционных параметров в командной строке. Если позиционных параметров нет, то в строках 11-19 активируется цикл while. Заметим, что цикл while выполняет оператор чтения, но не указывает, откуда дол- жен быть взят его вход. Это связано с тем, что входом по умолчанию является стандартный ввод (stdin). Для каждого имени файла, которое читается из стандартного ввода, запускается команда file системы UNIX. Выход команды file передается по программному каналу команде fgrep (а не grep, что увеличивает скорость), чтобы посмотреть, является ли файл текстовым.




- Начало -  - Назад -  - Вперед -