Утилита 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