UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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 %sn", NR, $0}'Выражение
%4NR%S$0nprintfprintfprintf(3)
