4.4 Язык
awkНекоторые ограничения
sedawksedsed$ awk 'программа' имена_файлов...но программа другая:
шаблон {действие}шаблон {действие}...Программа
awksedШаблоны могут быть регулярными выражениями в
sedegrep$ awk '/регулярное_выражение/ {print}' имена_файлов...Печатается каждая строка, соответствующая регулярному выражению.
Шаблоны или действия могут отсутствовать. Если отсутствует действие, то по умолчанию печатаются строки, соответствующие шаблону, поэтому команда
$ awk '/регулярное_выражение/' имена_файлов...эквивалентна предыдущей. Наоборот, если отсутствует шаблон, то действие выполняется для каждой входной строки. Следовательно, команда
$ awk '{print}' имена_файлов...дает те же результаты, что и команда
catТеперь перейдем к более интересным примерам, но прежде сделаем одно замечание. Как и в случае
sedawk$ awk -f кмд файл имена_файлов...Поля. В программе
awkwho$ whoyou tty2 sep 29 11:53jim tty4 sep 29 11:27$Поля обозначаются как
$1$2$NFNFNF=5NF$NFawk$du -а$ du -a | awk '{print $2}'а для печати имен пользователей, работающих в системе, и времени входа нужно задать:
$ who awk '{print $1, $5}'you 11:53jim 11:27 $Для печати имени и времени входа в систему, упорядоченных по времени, зададим:
$ who awk '{print $5, $1}' | sort11:27 jim11:53 you$Это альтернативные решения примеров, приведенных выше в данной главе, в которых использовалась команда
sedawkОбычно предполагается, что поля разделяются произвольным числом пробелов и символов табуляций, но можно определить в качестве разделителя любой одиночный символ. Один из способов состоит в задании в командной строке флага
-F/etc/passwd$ sed 3q /etc/passwdroot:3D.fHR5KoB.3s:0:1:S.User:/:ken:y.68wdl.ijayz:6:1:K.Thompson:/usr/ken:dmr:z4u3dJWbg7wCk:7:1:D.M.Ritchie:/usr/dmr:$Для печати имен пользователей, образующих первое поле, можно задать:
$ sed 3q /etc/passwd | awk -F : '{print $1}'rootkendmrОбработка пробелов и символов табуляции здесь особая. По умолчанию и пробелы, и символы табуляции служат разделителями, а разделители в начале строки отбрасываются. Однако если в качестве разделителя определен не пробел, то разделители в начале строки учитываются при определении полей. В частности, если используется символ табуляции, то пробелы не являются символами разделителями, пробелы в начале строки вводят в поле, и каждый символ табуляции определяет поле.
В программе
awkNR$ awk '{print NR, $0}'Поле
$0printФормат печати оператора
printприемлемымprintf$ awk '{printf "%4d %s\n", NR, $0}'Выражение
%4NR%S$0\nprintfprintfprintf(3)