Если вы проводите время в командной строке Linux, вы наверняка сталкивались с командой awk. С первого взгляда она может показаться сложной, но освоив ее, вы обнаружите, что это один из самых полезных инструментов для обработки текста.
awk - это мощный инструмент для обработки текстовых данных. Он считывает входные данные построчно, разбивает каждую строку на поля и позволяет выполнять операции над этими полями. Главное преимущество заключается в гибкости выполнения команд.
Простой пример использования awk
Начнем с файла. Например, у вас есть файл servers.txt, который выглядит так:
web01 192.168.1.10 runningweb02 192.168.1.11 stoppeddb01 192.168.1.20 running
Чтобы вывести только первые столбцы (имена серверов), введите команду:
awk '{ print $1 }' servers.txt
Вывод:
web01web02db01
Здесь $1 обозначает "первое поле". Аналогично, $2 даст вам IP-адреса, а $3 - статус.
Как awk разбивает поля
По умолчанию awk использует пробелы (пробелы или табуляции) как разделитель между полями. В примере выше он разбивает каждую строку на части, начиная с $1.
Существует также специальная переменная $0, которая означает всю строку. Например, print $0 выведет полную строку. Это полезно при комбинировании с другими командами.
Изменение разделителя полей
Пробелы не всегда подходят в качестве разделителя. Часто бывает необходимо обрабатывать CSV файлы или файлы, разделенные двоеточием, такие как /etc/passwd.
Вы можете задать свой разделитель с помощью опции -F:
awk -F: '{ print $1 }' /etc/passwd
Эта команда разбивает каждую строку по двоеточию и печатает первое поле, которое в /etc/passwd соответствует имени пользователя. Попробуйте сами - это просто и эффективно.
Вы можете использовать любой символ как разделитель. Например, для CSV файла:
awk -F, '{ print $2 }' data.csv
Печать нескольких полей
Вы можете не ограничиваться выводом одного поля. Просто указывайте их через запятую:
awk '{ print $1, $3 }' servers.txt
web01 runningweb02 stoppeddb01 running
Запятая между полями добавляет пробел. Если вам нужен другой разделитель, вы можете использовать переменную OFS (Output Field Separator):
awk 'BEGIN { OFS="," } { print $1, $3 }' servers.txt
web01,runningweb02,stoppeddb01,running
Блок BEGIN выполняется один раз до обработки любых строк, что удобно для настройки переменных.
Фильтрация строк по шаблону
Одно из главных достоинств awk заключается в том, что вы можете фильтровать строки, которые будут обрабатываться. Вы задаете шаблон перед блоком действий, и awk выполняет действия только на строках, которые соответствуют этому шаблону.
Вернемся к servers.txt: чтобы вывести только серверы со статусом "running":
awk '$3 == "running" { print $1 }' servers.txt
web01db01
Вы также можете использовать регулярные выражения для определения шаблонов. Например, чтобы найти любые строки, содержащие "web":
awk '/web/ { print $0 }' servers.txt
Это работает подобно grep, но позволяет объединить фильтрацию и извлечение полей в одну операцию.
Использование awk для арифметики
awk может выполнять арифметические операции, что делает его отличным инструментом для быстрых расчетов на табличных данных. Например, если у вас есть файл с числами:
item1 10 2.50item2 5 4.00item3 8 1.75
Чтобы рассчитать общую стоимость каждого элемента (количество × цена):
awk '{ print $1, $2 * $3 }' items.txt
Вывод:
item1 25item2 20item3 14
Можно также использовать переменную для накопления общей суммы:
awk '{ total += $2 * $3 } END { print "Total:", total }' items.txt
Вывод:
Total: 59
Блок END выполняется один раз после обработки всех строк.
Подсчет строк, которые соответствуют условию
Хотите подсчитать, сколько серверов запущено?
awk '$3 == "running" { count++ } END { print count }' servers.txt
Вывод:
2
Команда count++ увеличивает счетчик каждый раз, когда находится соответствующая строка.
Передача вывода в awk
Вы можете использовать awk не только с файлами. Он отлично работает с выводом команд, что делает его незаменимым инструментом для системных администраторов.
Например, чтобы вывести все запущенные процессы и показать только имя процесса и PID:
ps aux | awk '{ print $1, $2 }'
Или для проверки использования диска и выделения всего, что превышает 80%:
df -h | awk '$5 > "80%" { print $6, "is getting full:", $5 }'
Сочетая awk с другими командами, такими как ps, df, netstat или cat, вы получите мощный инструмент для администрирования системы.
Быстрая справка по командам awk
Вот основные команды awk в удобной форме:
| Что вы хотите сделать | Как это сделать |
|---|---|
| Вывести поле N | { print $N } |
| Вывести всю строку | { print $0 } |
| Установить пользовательский разделитель | -F"," или -F: |
| Фильтровать по значению поля | $N == "value" { ... } |
| Фильтровать по шаблону | /pattern/ { ... } |
| Выполнение перед обработкой | BEGIN { ... } |
| Выполнение после обработки | END { ... } |
| Арифметика | $2 * $3, total += $2 |
awk предлагает гораздо больше возможностей. Вы можете писать многострочные программы, определять функции и обрабатывать сложные преобразования данных. Однако приведенные выше примеры охватывают 90% ежедневного использования. Начинайте с них и развивайтесь дальше.
Если вам понравилось это руководство, ознакомьтесь с нашими инструкциями по grep и sed. Совместно с awk они покрывают большинство потребностей в обработке текста в командной строке.
