{ s += $1 } END { print "Сумма:", s, " Среднее арифметическое:", s/NR }
Листинг 6.26. Пример awk-программы, оперирующей с числами.
Командная строка из пример 6.27, служит для вывода тех строк файла f1.txt, у которых первое поле не совпадает с первым полем предыдущей строки.
awk '$1 != prev { print; prev = $1 }' f1.txt
Листинг 6.27. Пример awk-программы, заданной в командной строке.
Чтобы распечатать файл f2.txt, вставляя после слова "Page" номера страниц (начиная с первой), можно воспользоваться awk-программой (предполагается, что она помещена в файл prog.awk) и командной строкой, представленными, соответственно, в листингах пример 6.28 и пример 6.29.
/Page/ { $2 = n++ } { print }
Листинг 6.28. Пример awk-программы, использующей шаблоны.
awk -f prog.awk -v 'n=1' f2.txt
Листинг 6.29. Пример вызова awk-программы, использующей шаблоны.
Программа, показанная в пример 6.30, выводит поля входных записей, по одному на строке.
{ for (i = NF; i > 0; --i) print $i }
Листинг 6.30. Пример awk-программы, использующей оператор цикла.
Промоделировать работу утилиты echo можно с помощью awk-программы (см. пример 6.31).
BEGIN { for (i = 1; i < ARGC; ++i) printf ("%s%s", ARGV [i], i == ARGC - 1 ? "\n" : " ") }
Листинг 6.31. Пример awk-программы, использующей оператор цикла и специальные переменные awk.
Следующая awk-программа (см. пример 6.32) позволяет разложить список поиска, хранящийся в переменной окружения PATH, по элементам массива.
BEGIN { n = split (ENVIRON ["PATH"], path, ":") for (i = 1; i <= n; ++i) print path [i] }
Листинг 6.32. Пример awk-программы, использующей встроенную функцию split().
В пример 6.33 приведен фрагмент командного файла, выполняемого при выключении системы. Здесь можно обратить внимание на разные виды экранирования. (Третье поле в выдаче mount - это точка монтирования.)
# Перемонтируем на чтение все, что еще остается смонтированным. mount | awk '/( \/ |^\/dev\/root)/ { print $3 }' | while read line; do mount -n -o ro,remount $line done