Утилита awk представляет еще один мощный инструмент для работы с текстовыми файлами, предоставляя множество возможностей. Команда awk имеет следующий формат:
awk '/pattern/{action}' file
Сначала команде awk передается параметр pattern
- шаблон (регулярное выражение), которому должен сооответствовать текст. Обычно шаблоны заключаются между косыми чертами.
Далее идет параметр action
, который задает действия над найденным соответствием. Действия заключаются в фигурные скобки.
Поскольку awk работает с регулярными выражениями, то шаблон разумно помещать в одинарные кавычки, чтобы оболочка случайно не интерпретировала их.
И в конце команде передается файл для поиска соответствий.
Если шаблон не указан, то действие выполняется над каждой строкой файла. Если действие не указано, awk просто показывает строки, соответствующие шаблону.
Например, пусть в домашнем каталоге пользователя у нас есть следующий файл users.txt
Tom:39:Microsoft Bob:43:Google Sam:28:Jetbrains Alice:34:Microsoft Kate:25:Google Tim:23:- Tomas:31:Apple
Условно говоря, каждая строка содержит данные пользователя - имя, возраст, компанию, то есть три поля. И каждое поле отделено от других двоеточием. То есть каждая
строка имеет формат имя:возраст:компания
Допустим, нам надо получить все строки, где имя пользователя - "Tom":
eugene@Eugene:~$ awk '/Tom/' users.txt Tom:39:Microsoft Tomas:31:Apple
Утилита awk предоставляет ряд интересных возможностей, в частности, awk позволяет работать с файлами в табличной структурой, как наш файл. Например, для awk разделителем полей в строке по умолчанию является пробел. Однако в нашем файле таким разделителем является двоеточие. С помощью опции -F можно установить символ, который будет применяться в качестве разделителя.
Например, выведем только компанию, в которой работают пользователи с именем "Tom":
eugene@Eugene:~$ awk -F : '/Tom/{print $3}' users.txt Microsoft Apple
Здесь опции -F передается разделитель - двоеточие. Кроме того, здесь добавлено действие - встроенная команда awk - print, которая вывыодит передаенное ей значение. Ей передается значение $3 - это значение 3-го столбца. В нашем случае 1-й столбец представляет имя, 2-й столбец - возраст и 3-й - компанию. Специальное значение - $0 означает всю строку.
Если бы мы хотели вывести компанию для всех пользователей, то можно было опустить шаблон:
eugene@Eugene:~$ awk -F : '{print $3}' users.txt Microsoft Google Jetbrains Microsoft Google - Apple
Поскольку awk может ссылаться на определенные поля, можно также сравнивать поля друг с другом. Для этой цели доступны следующие операторы:
==
: Равно (ищет поле с тем же значением)
!=
: Не равно
<
: меньше, чем
<=
: меньше или равно
>
: Больше, чем
>=
: больше или равно
С помощью этих операторов вы можете выполнять некоторые вычисления с текстовыми файлами. Например, выведем пользователей, у которых возраст больше 30:
eugene@Eugene:~$ awk -F : '$2 > 30 {print $1}' users.txt Tom Bob Alice Tomas