Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
Команда grep выводит сообщение об ошибке, в которой говорится о том, что указанного файла не существует. Можно попробовать провести поиск во всех файлах каталога /etc:
$ grep louise /etc/*
Однако в результате будут выведены многочисленные сообщения об ошибках, гласящие, что к определенным файлам доступ запрещен, а некоторые элементы каталога являются подкаталогами и поиск в них не ведется.
В подобной ситуации можно воспользоваться опцией -s, которая подавляет вывод сообщений об ошибках:
$ grep -a louise /etc/*
Если ваша версия команды grep не поддерживает данную опцию, воспользуйтесь следующей командой:
$ grep louise /etc/* 2> /dev/null
Эта
8.4.3. Фильтрация списка процессов
Совместное применение команд grep и ps а позволяет выяснить, выполняется ли в системе некоторый процесс. Опция а команды ps задает вывод списка всех процессов, включая процессы других пользователей. Например, следующая команда проверяет, выполняется ли в данный момент процесс named:
$ ps а | grep named
211 ? S 4.56 named
303 3 s 0.00 grep named
Выводимый результат включает также саму команду grep, поскольку она создает процесс, выполняющий фильтрацию текста в канале, и команда ps распознает этот процесс. Чтобы исключить команду grep из результата, задайте дополнительную команду grep с опцией -v:
$ ps ах | grep named | grep -v "grep"
211 ? S 4.56 named
8.5. Команда egrep
Команда egrep (extended grep( воспринимает как базовые, так и расширенные регулярные выражения. Одной из привлекательных ее особенностей является возможность сохранения шаблонов поиска в файле. Подключается этот файл с помощью опции -f. Рассмотрим пример:
$ cat grepstrings
484
47
$ egrep -f grepstrings data.f
В этом случае в файле data.f осуществляется поиск записей, которые содержат последовательность символов "484" или "47". Создание файла шаблонов удобно в том случае, когда шаблонов очень много и вводить их в командной строке затруднительно. Если шаблонов немного, воспользуйтесь метасимволом '|', который позволяет сделать выбор между несколькими шаблонами. Например, следующая команда ищет в файле data.f записи, содержащие последовательность символов "3ZL" или "2СС":
$ egrep '3ZL|2CC' data.f
47 Oct 3ZL1998 LPSX 43 .00 KVM9D Ы2
219 dec 2СС1999 CAD 23 .00 PLV2C 68
216 sept 3ZL1998 USP 86 .00 KVM9E 234
Метасимвол '|' можно применять более одного раза. Например, чтобы узнать, зарегистрированы ли в системе пользователи louise, matty и pauline, выполните команду who и направьте результаты ее работы команде egrep:
$ who | egrep 'louise|matty|pauline'
louise pty8
mattу tty02
pauline pty2
Круглые скобки позволяют представить выражение с несколькими шаблонами как один шаблон. Так, с помощью представленной ниже команды можно найти в текущем каталоге файлы, в которых встречаются слова из ряда "shutdown", "shutdowns", "reboot" и "reboots":
$ egrep '[shutdown|reboot]s?' *
8.6. Заключение
В настоящей главе продемонстрированы лишь некоторые из многочисленных возможностей команды grep, которая является универсальным инструментом фильтрации, очень популярным среди пользователей UNIX и Linux. Существует несколько ее разновидностей, которые в некоторых системах заменены единой GNU–командой grep. Как будет показано далее в этой книге, команда grep также является важным инструментом shell–программирования,
используемым в связке с другими утилитами UNIX.ГЛАВА 9
Утилита awк
При форматировании отчетов и извлечении информации из больших текстовых файлов неоценимую помощь оказывает утилита awk, которая обладает мощными средствами обработки текста. Как показывает опыт, среди всех инструментов фильтрации, имеющихся в интерпретаторе shell, труднее всего освоить работу именно с awk. Причина этого явления не ясна. Может быть, дело в синтаксисе утилиты или не совсем понятных сообщениях об ошибках, таких как bailing out и awk: cmd. line:. Подобные сообщения довольно часто встречаются при программировании на языке awk. Именно так — язык awk, поскольку это совершенно самостоятельный язык программирования. Возможно, изучать его нелегко, но его совместное применение с другими инструментальными средствами, такими как команда grep и редактор sed, позволяет значительно упростить программирование в интерпретаторе shell.
В главе не делается попытка изучить все возможности утилиты awk и не рассматриваются методы написания сложных сценариев на языке awk, так как для этого потребовалась бы отдельная книга. Мы научимся создавать эффективные однострочные команды и небольшие сценарии, выполняющие фильтрацию текстовых файлов и строк. Итак, в этой главе рассматриваются следующие темы:
• выборка текстовых полей;
• использование регулярных выражений;
• сравнение текстовых полей;
• передача параметров утилите awk;
• базовые команды и сценарии awk.
Название утилиты awk составлено из начальных букв фамилий разработчиков языка: Ахо (Aho), Вайнбергера (Weinberger) и Кернигана (Kernighan). Существуют также утилиты nawk и gawk, обладающие усовершенствованными возможностями обработки текста. Но эти утилиты здесь не рассматриваются.
Основная задача утилиты awk заключается в просмотре текстового файла или строки с целью нахождения в них информации, соответствующей заданному критерию отбора. После выборки нужных данных можно применить к ним функции, выполняющие обработку текста. Сложные сценарии awk обычно применяются для форматирования отчетов на базе текстовых файлов.
9.1. Вызов awk
Вызвать утилиту awk можно тремя способами. Первый заключается в передаче ей требуемых команд непосредственно в командной строке:
awk [-F разделитель_полей] 'сценарий' входной_файл…
В одинарных кавычках указывается список инструкций языка awk. Именно этому способу отдается преимущество в примерах настоящей главы.
Задавать разделитель полей с помощью опции -F не обязательно, так как по умолчанию утилита awk использует для этих целей пробел. Но, например, в файле /etc/passwd поля отделяются друг от друга двоеточием. В данном случае вызов утилиты выглядит так:
awk -F: 'сценарий' входной_файл…
Второй способ вызова утилиты awk состоит в создании отдельного файла сценария, содержащего список инструкций awk. При этом утилита awk указывается в первой строке сценария в качестве интерпретатора команд. Созданный файл делается исполняемым и может быть вызван из командной строки.
Согласно третьему способу все инструкции awk помещаются в отдельный файл, после чего осуществляется вызов этого файла:
awk -f файл_сценария входной_файл…
Опция -f свидетельствует о том, что инструкции awk содержатся в файле сценария.