Руководство пользователя для GNU Awk
5. Чтение входных файлов
5.5 Задание разделителей полей
5.5.4 Установка FS из командной строки
FS может быть установлена из командной строки. Для этого нужно использовать параметр `-F'.
Например,
awk -F, 'program' input-files
устанавливает в FS символ `,'. Заметьте, что параметром служит заглавное `F'. В отличие от этого `-f' указывает, что файл содержит программу awk. Регистр имеет значение в параметрах командной строки: параметры `-F' и `-f' не имеют ничего общего. Их можно использовать одновременно для установки переменной FS и получения awk-программы из файла.
Значение, используемое в качестве аргумента для `-F', обрабатывается точно так же как при присваивании встроенной переменной FS. Это значит, что если разделитель поля содержит специальные символы, они должны быть указаны соответствующими управляющими последовательностями.
Например, чтобы
использовать `"' как разделитель полей, нужно напечатать:
# что-нибудь такое как FS = """" awk -F"""" '...' files ...
Поскольку `"' используется в оболочке как кавычка, awk увидит `-F""'. Тогда awk обработает `""' как управляющую последовательность (см. раздел 4.2 [Управляющие последовательности], стр. 24), и получит в результате одну `"' в качестве разделителя полей.
В специальном случае, в режиме эмуляции (см. раздел 14.1 [Параметры командной строки], стр. 161), если аргумент при `-F' есть `t', то FS получит значение символа tab. Это произойдет потому, что при печати `-F"t' в оболочке, без всяких кавычек, `"' удаляется, так что awk предположит, что на самом деле вы хотите разделять поля символами tab, а не `t'. Употребляйте `-v FS="t"' в командной строке, если вы на самом деле хотите отделять поля буквой `t' (см. раздел 14.1 [Параметры командной строки], стр. 161).
Например, воспользуемся программным файлом awk с именем `baud.awk', который содержит образец /300/ и действие `print $1'. Вот эта программа:
/300/ - print $1 ""
Установим также в FS символ `-' и исполним программу для входного файла `BBS-list'. Следующая команда напечатает список имен досок объявлений, которые работают со скоростью 300 бод, и первые три цифры их телефонных номеров:
$ awk -F- -f baud.awk BBS-list
a aardvark 555
a alpo
a barfly 555...
Обратите внимание на вторую строку вывода. В оригинальном входном файле (см. раздел 1.3 [Файлы с данными для примеров], стр. 7), вторая строка выглядит так:
alpo-net 555-3412 2400/1200/300 A
Символ `-', часть системного имени, использован как разделитель полей вместо `-' в телефонном номере, как было задумано. Это показывает, почему надо быть осторожным в выборе полей и разделителей записей. На многих системах Unix каждый пользователь имеет отдельный вход в системном файле с паролями, одну строку на пользователя. Информация в строке разделена на части двоеточиями. Первое поле содержит регистрационное имя пользователя, второе есть его секретный пароль.
Строка этого файла может выглядеть подобно следующей:
arnold:xyzzy:2076:10:Arnold Robbins:/home/arnold:/bin/sh
Следующая программа просматривает системный файл с паролями и печатает входы пользователей, не имеющих пароля:
awk -F: '$2 == ""' /etc/passwd
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|