Утилита awk.

AWK — интерпретируемый скриптовый язык, предназначенный для обработки текстовой информации. Первая версия AWK была написана в 1977 году в AT&T Bell Laboratories и получила название по фамилиям своих разработчиков: Альфреда Ахо (Alfred V. Aho), Питера Вейнбергера (Peter J. Weinberger) и Брайана Кернигана (Brian W. Kernighan).

AWK рассматривает входной поток как набор записей, каждая из которых состоит из набора полей. По-умолчанию для AWK записью является строка, а разделителями полей в строке — пробелы. Внутри программы на AWK значение поля можно получить как значение переменной $1, $2, $3, ... Переменная $0 содержит в себе всю запись.

Программа на AWK имеет вид

PATTERN {ACTION}

PATTERN {ACTION}

...

Для каждой строки, совпадающей с шаблоном, выполняется указанное действие. Если шаблон не указан, то действие выполняется для всех строк.

Шаблон — это регулярное выражение, из большого числа возможных действий мы рассмотрим только команду print.

Рассмотрим использование команды awk на примерах.

Список файлов с указанием их владельцев, прав, и даты последнего изменения можно получить командой ls -l. Он имеет вид:

$ ls -l /bin | head -n 5

total 5596

lrwxrwxrwx 1 root root 4 Feb 25 05:30 awk -> gawk

-rwxr-xr-x 1 root root 19064 Apr 20 2008 basename

-rwxr-xr-x 1 root root 549368 Mar 27 2008 bash

lrwxrwxrwx 1 root root 4 Feb 25 05:30 bash2 -> bash

Преобразуем этот список в формат

<имя файла> <владелец>:<группа> <права>

awk обрабатывает каждую строку списка отдельно, и самостоятельно разбивает её на поля по границам слов. Права файла — поле 1, владелец и группа — поля 3 и 4, имя файла — поле 9. Тогда:

$ ls -l /bin | awk '{print $9,$3":"$4,$1;}' | head

: total

awk root:root lrwxrwxrwx

basename root:root -rwxr-xr-x

bash root:root -rwxr-xr-x

bash2 root:root lrwxrwxrwx

bunzip2 root:root lrwxrwxrwx

bzcat root:root lrwxrwxrwx

bzip2 root:root -rwxr-xr-x

bzip2recover root:root -rwxr-xr-x

cat root:root -rwxr-xr-x

Можно отфильтровать список и вывести только файлы. Для файлов первый символ поля прав — - (дефис). Для форматирования вывода разделим выводящиеся значения символами табуляции (код символа \t). С учётом этого получаем:

$ ls -l /bin | awk '/^-/ {print $9"\t->\t"$3":"$4"\t"$1;}' | head

basename -> root:root -rwxr-xr-x

bash -> root:root -rwxr-xr-x

bzip2 -> root:root -rwxr-xr-x

bzip2recover -> root:root -rwxr-xr-x

cat -> root:root -rwxr-xr-x

chgrp -> root:root -rwxr-xr-x

chmod -> root:root -rwxr-xr-x

chown -> root:root -rwxr-xr-x

clock_unsynced -> root:root -rwxr-xr-x

cp -> root:root -rwxr-xr-x