Если вы проводите время в командной строке 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 они покрывают большинство потребностей в обработке текста в командной строке.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *