Извлечение столбцов с помощью AWK

LinuxBeginner
Практиковаться сейчас

Введение

При работе со структурированными текстовыми данными в Linux — например, с файлами журналов, CSV-файлами или файлами конфигурации — часто требуется извлечь определённые столбцы. Например, может понадобиться получить только имена пользователей из системного файла или коды состояния из журнала веб-доступа.

Основной инструмент для этой задачи — awk.

awk рассматривает текст как последовательность записей (строк) и полей (столбцов). Поэтому обычный текст остаётся таким полезным в Linux: многие форматы административных данных легко просматривать глазами и обрабатывать с помощью инструментов командной строки.

  • Записи обычно разделяются символами новой строки.
  • Поля обычно разделяются пробельными символами — пробелами или табуляцией.

Эта модель «записи и поля» помогает понять принцип работы awk. Вместо необработанного текста в файле awk видит структурированные строки и столбцы, к которым можно обращаться напрямую.

В этой лабораторной работе вы научитесь использовать awk, чтобы:

  1. Выбирать поля: извлекать определённые столбцы с помощью $1, $2 и других обозначений.
  2. Задавать разделители полей: обрабатывать данные, разделённые не пробелами, а другими символами, например двоеточиями или запятыми, с помощью параметра -F.
  3. Обращаться к последнему полю: динамически получать последнее поле строки с помощью $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:

  1. Извлечение полей ($N): обращение к отдельным столбцам данных с помощью $1, $2 и других обозначений.
  2. Разделители полей (-F): обработка файлов с разными разделителями, например двоеточиями или запятыми, с помощью параметра -F.
  3. Последнее поле ($NF): динамическое обращение к последнему столбцу записи.

Эти приёмы позволяют преобразовывать необработанный структурированный текст в удобные потоки данных для дальнейшей обработки.