Введение
При работе со структурированными текстовыми данными в Linux — например, с файлами журналов, CSV-файлами или файлами конфигурации — часто требуется извлечь определённые столбцы. Например, может понадобиться получить только имена пользователей из системного файла или коды состояния из журнала веб-доступа.
Основной инструмент для этой задачи — awk.
awk рассматривает текст как последовательность записей (строк) и полей (столбцов). Поэтому обычный текст остаётся таким полезным в Linux: многие форматы административных данных легко просматривать глазами и обрабатывать с помощью инструментов командной строки.
- Записи обычно разделяются символами новой строки.
- Поля обычно разделяются пробельными символами — пробелами или табуляцией.
Эта модель «записи и поля» помогает понять принцип работы awk. Вместо необработанного текста в файле awk видит структурированные строки и столбцы, к которым можно обращаться напрямую.
В этой лабораторной работе вы научитесь использовать awk, чтобы:
- Выбирать поля: извлекать определённые столбцы с помощью
$1,$2и других обозначений. - Задавать разделители полей: обрабатывать данные, разделённые не пробелами, а другими символами, например двоеточиями или запятыми, с помощью параметра
-F. - Обращаться к последнему полю: динамически получать последнее поле строки с помощью
$NF.
Извлечение первого поля
Начнём с простого файла, в котором поля разделены пробелами. Мы уже создали для вас файл data.txt.
Просмотрите его содержимое:
cat data.txt
Результат:
John 25 Engineer
Alice 30 Manager
Bob 22 Intern
Для awk каждая строка — это запись, а каждое слово — поле:
- Поле 1 ($1): имя, например John
- Поле 2 ($2): возраст, например 25
- Поле 3 ($3): должность, например Engineer
Если нужно извлечь только имена, то есть первый столбец, укажите awk вывести $1.
В awk выражения $1, $2 и аналогичные обозначают поля текущей записи. $0 означает всю текущую строку. Именно благодаря такому обозначению полей awk позволяет кратко обрабатывать структурированный текст.
Выполните следующую команду:
awk '{print $1}' data.txt
Результат:
John
Alice
Bob
Теперь сохраним этот результат в файл:
awk '{print $1}' data.txt > output1.txt
Проверьте содержимое нового файла:
cat output1.txt
Разделение полей
Теперь рассмотрим другой формат файла: /etc/passwd. В этом файле хранится информация об учётных записях пользователей.
Просмотрите начало файла passwd:
head -n 3 /etc/passwd
Результат будет выглядеть примерно так: root:x:0:0:root:/root:/bin/bash
Обратите внимание: пробелов нет. Вместо них поля разделены двоеточиями (:).
Если выполнить для этого файла стандартную команду awk, она неправильно разделит поля, потому что по умолчанию ожидает пробелы.
Проверьте это:
awk '{print $1}' /etc/passwd > output2.txt
head -n 3 output2.txt
Вы увидите, что команда выводит всю строку. Поскольку awk не нашла пробелов, она восприняла всю строку как одно поле ($1).
Чтобы исправить это, нужно указать пользовательский разделитель полей.
Это важный принцип обработки текстовых данных на практике: результат зависит от того, насколько хорошо вы понимаете формат данных. Если выбрать неправильный разделитель, извлекаемые столбцы не будут соответствовать столбцам, которые видит awk.
Использование пользовательского разделителя полей (-F)
Чтобы преобразовать данные, разделённые двоеточиями, в доступные для обработки поля, используйте параметр -F.
Команда awk -F: указывает awk использовать двоеточие в качестве разделителя между столбцами.
Параметр -F изменяет способ разбора каждой строки командой awk до выполнения вывода или другой логики. После правильного разделения строки такие ссылки на поля, как $1 и $7, снова начинают указывать на нужные значения.
Теперь можно извлечь определённые поля. В файле /etc/passwd:
- Поле 1 — имя пользователя.
- Поле 7 — оболочка.
Извлечём только имя пользователя и оболочку. Чтобы вывести несколько полей, разделите их запятой.
awk -F: '{print $1, $7}' /etc/passwd > output3.txt
Проверьте результат:
head -n 5 output3.txt
Результат должен выглядеть примерно так: root /bin/bash
awk успешно разделила строку по двоеточиям и вывела первое и седьмое поля, разделив их в результате пробелом.
Вывод последнего поля ($NF)
Иногда точное количество столбцов в строке неизвестно или оно может меняться. При этом нужные данные могут всегда находиться в последнем столбце.
В awk есть встроенная переменная $NF (Number of Fields, количество полей).
NFхранит количество полей в текущей строке.$NFобозначает значение последнего поля.
Это удобно, потому что команда меньше зависит от жёстко заданного номера столбца. Когда важнее положение поля с конца, а не его абсолютный номер, NF и $NF часто оказываются более гибкими.
Извлечём последний столбец файла /etc/passwd с помощью $NF.
awk -F: '{print $NF}' /etc/passwd > output4.txt
Проверьте результат:
head -n 5 output4.txt
Значения снова должны соответствовать оболочке, например /bin/bash, как и при использовании $7, если структура файла остаётся неизменной. Использование $NF часто надёжнее, поскольку команда автоматически обращается к концу строки.
Итоги
В этой лабораторной работе вы изучили основы разбора текста с помощью awk:
- Извлечение полей (
$N): обращение к отдельным столбцам данных с помощью$1,$2и других обозначений. - Разделители полей (
-F): обработка файлов с разными разделителями, например двоеточиями или запятыми, с помощью параметра-F. - Последнее поле (
$NF): динамическое обращение к последнему столбцу записи.
Эти приёмы позволяют преобразовывать необработанный структурированный текст в удобные потоки данных для дальнейшей обработки.



