Цель урока: Освоить основы awk, одного из самых мощных инструментов командной строки для обработки текста. Мы научимся "видеть" текстовые файлы не как сплошной поток символов, а как таблицы, состоящие из строк и столбцов. Это позволит нам извлекать данные из конкретных столбцов, форматировать вывод и создавать простые отчеты прямо из терминала.
Часть 1: Теория. Новая парадигма: awk видит столбцы
Давайте еще раз вспомним нашу "троицу":
-
grep: Находит строки по шаблону.
-
sed: Находит и изменяет строки по шаблону.
-
awk: "Читает" каждую строку, разбивает ее на столбцы (поля) и позволяет вам производить с этими столбцами различные манипуляции.
awk - это, по сути, целый язык программирования, предназначенный для обработки текста. Его главная идея в том, что он обрабатывает входные данные построчно. Каждую прочитанную строку (awk называет ее записью, record) он автоматически разбивает на поля (fields).
-
Запись (Record): По умолчанию, это одна строка текста.
-
Поле (Field): По умолчанию, это одно "слово" в строке, то есть текст, отделенный пробелами или знаками табуляции.
awk предоставляет нам доступ к этим полям через специальные переменные:
-
$0: Вся строка (запись) целиком.
-
$1: Первое поле (первый столбец).
-
$2: Второе поле (второй столбец).
-
$3, $4, и так далее до последнего поля в строке.
Базовый синтаксис awk:
awk 'ШАБЛОН { ДЕЙСТВИЕ }' /путь/к/файлу
-
ШАБЛОН (PATTERN): Это условие, похожее на то, что мы использовали в if. Если строка соответствует этому шаблону, то для нее выполняется ДЕЙСТВИЕ. Если шаблон опущен, ДЕЙСТВИЕ выполняется для каждой строки.
-
{ ДЕЙСТВИЕ (ACTION) }: Это блок кода, заключенный в фигурные скобки, который выполняется, если шаблон сработал. Чаще всего здесь используется команда print. Если ДЕЙСТВИЕ опущено, выполняется действие по умолчанию - print $0 (напечатать всю строку).
Часть 2: Практика. Блок ДЕЙСТВИЕ - работаем со столбцами
Давайте начнем с самого простого: будем выполнять действие для каждой строки. Для этого мы просто опустим ШАБЛОН.
Пример 1: Вывод конкретных столбцов
Команда ls -l
выводит информацию о файлах в виде таблицы. Это идеальный кандидат для awk.
Шаг 1: Посмотрим на исходные данные
Выполните эту команду в вашем каталоге ~/scripts.
ls -l
Вы увидите примерно такой вывод:
-rwxr-xr-x 1 root root 135 Aug 15 10:00 archiver.sh
-rwxr-xr-x 1 root root 230 Aug 15 10:15 backup_functional.sh
-rw-r--r-- 1 root root 0 Aug 15 09:55 doc1.txt
Здесь rwxr-xr-x - это поле $1, 1 - $2, root - $3, root - $4, 135 - $5, и так далее. Имя файла - это $9.
Шаг 2: Используем awk, чтобы вывести только имена файлов
ls -l | awk '{ print $9 }'
Результат на экране:
archiver.sh
backup_functional.sh
doc1.txt
Как это работает:
-
ls -l
выполнилась и передала свой "табличный" вывод по конвейеру | на вход awk. -
awk получил первую строку. Шаблона нет, поэтому он сразу выполняет действие { print $9 }. Он смотрит на 9-е поле в этой строке и печатает его.
-
Затем awk берет вторую строку, печатает ее 9-е поле, и так далее.
Пример 2: Вывод нескольких столбцов и своего текста
Давайте выведем размер и имя файла, добавив поясняющий текст.
ls -l | awk '{ print "Файл:", $9, "имеет размер:", $5, "байт" }'
Результат на экране:
Файл: archiver.sh имеет размер: 135 байт
Файл: backup_functional.sh имеет размер: 230 байт
Файл: doc1.txt имеет размер: 0 байт
Пример 3: Встроенные переменные NR и NF
У awk есть очень полезные встроенные переменные:
-
NR (Number of Record): Номер текущей строки (записи).
-
NF (Number of Fields): Количество полей (столбцов) в текущей строке.
Давайте пронумеруем наш список файлов:
ls -l | awk '{ print NR, "-", $9 }'
Результат на экране:
1 - archiver.sh
2 - backup_functional.sh
3 - doc1.txt
А теперь выведем последнее поле каждой строки. Это очень полезный трюк.
# Так как NF - это число полей, то $NF - это обращение к последнему полю!
ls -l | awk '{ print $NF }'
Результат будет таким же - имена файлов, так как в выводе ls -l
имя файла всегда идет последним.
Часть 3: Практика. Блок ШАБЛОН - выбираем нужные строки
Теперь давайте научимся выбирать, для каких строк выполнять действие.
Пример 1: Простой текстовый поиск (аналог grep)
Посмотрим на файл /etc/passwd. Он содержит информацию о пользователях. Выведем только строки, содержащие слово root.
awk '/root/ { print $0 }' /etc/passwd
Как это работает:
-
awk читает файл /etc/passwd строка за строкой.
-
Шаблон /root/ означает: "Если в строке есть последовательность символов root".
-
Если есть, выполняется действие { print $0 } (напечатать всю строку).
-
Этот пример делает то же самое, что и grep "root" /etc/passwd.
Пример 2: Условие по значению столбца
Вот где awk начинает показывать свою истинную мощь. Давайте выведем из файла /etc/passwd информацию только о тех пользователях, у которых в качестве оболочки (shell) прописан /bin/bash. Оболочка - это 7-й (и последний) столбец, разделенный двоеточием.
Сначала нам нужно сказать awk, что разделитель полей - это :, а не пробел. Для этого используется опция -F.
awk -F':' '$7 == "/bin/bash" { print "Пользователь:", $1, "использует bash" }' /etc/passwd
Как это работает:
-
-F':' - мы задали разделитель полей: двоеточие.
-
Шаблон $7 == "/bin/bash" - это уже не простой поиск текста, а логическое условие! "Если седьмое поле ($7) в точности равно (==) строке /bin/bash".
-
Если условие истинно, выполняется print.
Пример 3: Числовое сравнение
Вернемся к ls -l. Давайте найдем все файлы в /etc, размер которых (5-е поле) больше 10000 байт.
ls -l /etc | awk '$5 > 10000 { print $9, "имеет размер", $5 }'
Здесь шаблон $5 > 10000 - это числовое сравнение. awk достаточно умен, чтобы понять, что $5 - это число, и сравнить его.
Часть 4: Заключение
Мы изучили самую суть awk - его способность видеть структуру в тексте. Вы научились:
-
Разделять текст на поля ($1, $2, $NF).
-
Выводить нужные поля и форматировать вывод (print).
-
Использовать встроенные переменные (NR, NF).
-
Выбирать строки для обработки с помощью шаблонов: как текстовых (/слово/), так и логических ($1 == "root", $5 > 1000).
awk - это невероятно глубокий инструмент, по сути, полноценный язык программирования. Но даже этих базовых навыков достаточно, чтобы решать огромный круг задач по анализу данных, которые не под силу grep и sed.
На следующем, 20-м уроке, мы завершим наш большой блок по продвинутым инструментам командной строки и перейдем к важной практической теме - архивированию и сжатию. Мы глубоко разберем команду tar, научимся создавать, просматривать и распаковывать архивы, а также использовать утилиты gzip и bzip2 для эффективного сжатия данных. Это ключевой навык для создания резервных копий и переноса файлов.
Перейти к просмотру - УРОК №20.
Промо-код: PROMO15 - скидка 15%!
Введите при оформлении первого заказа на сайте: Hosting-VDS.com