Цель урока: Освоить основы 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 - это поле $11 - $2root - $3root - $4135 - $5, и так далее. Имя файла - это $9.

Шаг 2: Используем awk, чтобы вывести только имена файлов

ls -l | awk '{ print $9 }'

Результат на экране:

archiver.sh
backup_functional.sh
doc1.txt

Как это работает:

  1. ls -l выполнилась и передала свой "табличный" вывод по конвейеру | на вход awk.

  2. awk получил первую строку. Шаблона нет, поэтому он сразу выполняет действие { print $9 }. Он смотрит на 9-е поле в этой строке и печатает его.

  3. Затем 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).

  • Использовать встроенные переменные (NRNF).

  • Выбирать строки для обработки с помощью шаблонов: как текстовых (/слово/), так и логических ($1 == "root"$5 > 1000).

awk - это невероятно глубокий инструмент, по сути, полноценный язык программирования. Но даже этих базовых навыков достаточно, чтобы решать огромный круг задач по анализу данных, которые не под силу grep и sed.

На следующем, 20-м уроке, мы завершим наш большой блок по продвинутым инструментам командной строки и перейдем к важной практической теме - архивированию и сжатию. Мы глубоко разберем команду tar, научимся создавать, просматривать и распаковывать архивы, а также использовать утилиты gzip и bzip2 для эффективного сжатия данных. Это ключевой навык для создания резервных копий и переноса файлов.

Перейти к просмотру - УРОК №20.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи считают это полезным (0 голосов)