В этом базовом руководстве вы узнаете самые основы команды
awk
, а также увидите некоторые способы её использования при работе с текстом, включая вывод содержимого файла, а также его конкретных столбцов, строк и слов по указанным критериям. Приступим!
Что это за команда awk?
AWK – это скриптовый язык, который полезен при работе в командной строке и широко применяется для обработки текста.
При использовании awk
вы можете выбирать данные – один или более отдельных фрагментов текста – на основе заданного критерия. Например, с помощью awk
можно выполнять поиск конкретного слова или шаблона во фрагменте текста, а также выбирать определённую строку/столбец в файле.
Базовый синтаксис awk
Простейшая форма команды awk
подразумевает описание основного действия в одинарных кавычках и фигурных скобках с указанием после него целевого файла.
Выглядеть она может так:
awk '{action}' your_file_name.txt
Когда вам нужно найти текст, соответствующий конкретному шаблону, или же конкретное слово в тексте, команда принимает следующий вид:
awk '/regex pattern/{action}' your_file_name.txt
Создание образца файла
Для создания файла в командной строке используется команда touch
. Например: touch filename.txt
, где filename
– это произвольное имя файла.
Затем можно с помощью команды open
(open filename.txt
) запустить обработчик текста вроде TextEdit, который позволит внести в файл нужное содержимое.
Предположим, у вас есть текстовый файл information.txt, содержащий данные, разделённые по столбцам.
Выглядеть этот файл может так:
firstName lastName age city ID
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Wood Tinker 54 Lisbon N/A
Giorgos Georgiou 35 London 300
Timmy Turner 32 Berlin N/A
В приведённом примере мы видим по одному столбцу для
firstName
, lastName
, age
, city
и ID
.
В любой момент можно просмотреть вывод содержимого вашего файла, выполнив cat text_file
, где text_file
представляет имя файла.
Вывод всего содержимого файла
Для вывода всего содержимого файла в качестве действия в фигурных скобках нужно указать print $0
.
Сработает эта команда аналогично ранее упомянутой cat
.
awk '{print $0}' information.txt
Вывод:
firstName lastName age city ID
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Wood Tinker 54 Lisbon N/A
Giorgos Georgiou 35 London 300
Timmy Turner 32 Berlin N/A
Если захотите добавить нумерацию строк, то нужно будет дополнить действие переменной NR
:
awk '{print NR,$0}' information.txt
1 firstName lastName age city ID
2
3 Thomas Shelby 30 Rio 400
4 Omega Night 45 Ontario 600
5 Wood Tinker 54 Lisbon N/A
6 Giorgos Georgiou 35 London 300
7 Timmy Turner 32 Berlin N/A
Вывод конкретных столбцов
При использовании awk
можно указывать для вывода конкретные столбцы.
Вывод первого производится следующей командой:
awk '{print $1}' information.txt
Вывод:
Thomas
Omega
Wood
Giorgos
Timmy
Здесь $1
означает первое поле, то есть в данном случае первый столбец.
Для вывода второго столбца используется $2
:
awk '{print $2}' information.txt
Вывод:
lastName
Shelby
Night
Tinker
Georgiou
Turner
По умолчанию начало и конец каждого столбца awk
определяет по пробелу.
Для вывода большего числа столбцов, например, первого и четвёртого, нужно выполнить:
awk '{print $1, $4}' information.txt
Вывод:
firstName city
Thomas Rio
Omega Ontario
Wood Lisbon
Giorgos London
Timmy Berlin
Здесь $1
представляет первое поле ввода (первый столбец), а $4
четвёртое. При этом они отделяются запятой, чтобы вывод разделялся пробелом и был более читаемым.
Для вывода последнего поля (последнего столбца) также можно использовать команду $NF
, представляющую последнее поле записи:
awk '{print $NF}' information.txt
Вывод:
ID
400
600
N/A
300
N/A
Вывод конкретных строк столбца
Также можно указывать для вывода строку определённого столбца:
awk '{print $1}' information.txt | head -1
Вывод:
FirstName
Разделим эту команду на две части. Сначала awk '{print $1}' information.txt
выводит первый столбец. Затем её результат (который мы видели выше) с помощью символа |
передаётся на обработку команде head
, где аргумент -1
указывает на выбор первой строки столбца.
Для вывода двух строк команда будет такой:
awk '{print $1}' information.txt | head -2
Вывод:
FirstName
Dionysia
Вывод строк с заданным шаблоном
Вы можете выводить строку, начинающуюся с заданной буквы. Например:
awk '/^O/' information.txt
Вывод:
Omega Night 45 Ontario 600
Эта команда выбирает все строки с текстом, начинающимся на O
.
Действие команды начинается с символа ^
, который указывает на начало строки. После этого прописывается буква, с которой нужная вам строка должна начинаться.
По аналогичному принципу можно выводить строку, завершающуюся конкретным шаблоном:
awk '/0$/' information.txt
Вывод:
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Giorgos Georgiou 35 London 300
Эта команда выводит строки, оканчивающиеся на 0
– здесь с помощью символа $
мы указываем, как должна заканчиваться нужная строка.
При этом её можно несколько изменить:
awk '! /0$/' information.txt
Символ !
используется в качестве приставки «НЕ», а значит, в этом случае будут выбраны строки, которые не оканчиваются на 0
.
firstName lastName age city ID
Wood Tinker 54 Lisbon N/A
Timmy Turner 32 Berlin N/A
Использование регулярных выражений
Для вывода слов, содержащих определённые буквы, а также слов, соответствующих указанному шаблону, мы снова используем прямые слэши.
К примеру, если нас интересуют слова, содержащие io
, мы пишем:
awk ' /io/{print $0}' information.txt
Вывод:
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Giorgos Georgiou 35 London 300
Мы получили строки, в которых содержатся слова, содержащие io
.
Теперь предположим, что в файле есть дополнительный столбец department
:
firstName lastName age city ID department
Thomas Shelby 30 Rio 400 IT
Omega Night 45 Ontario 600 Design
Wood Tinker 54 Lisbon N/A IT
Giorgos Georgiou 35 London 300 Data
Timmy Turner 32 Berlin N/A Engineering
Для поиска всей информации о людях, работающих в IT
, нужно указать искомую строку между //
:
awk '/IT/' information.txt
Вывод:
Thomas Shelby 30 Rio 400 IT
Wood Tinker 54 Lisbon N/A IT
А что, если мы хотим увидеть только имена и фамилии сотрудников из IT
?
Тогда можно указать столбец так:
awk '/IT/{print $1, $2}' information.txt
Вывод:
Thomas Shelby
Wood Tinker
В этом случае отобразятся только первый и второй столбцы строк, содержащих IT
.
При поиске слов, содержащих конкретный шаблон, бывают случаи, когда требуется использовать экранирующий символ:
awk '/N/A$/' information.txt
Вывод:
Wood Tinker 54 Lisbon N/A
Timmy Turner 32 Berlin N/A
Я хотела найти строки, оканчивающиеся на N/A
. Поэтому при указании критериев поиска в ' // '
, как это показывалось выше, мне пришлось использовать между N/A
символ перехода . В противном случае возникла бы ошибка.
Использование операторов сравнения
Если вы, предположим, захотите найти всю информацию о сотрудниках в возрасте до 40 лет, то нужно будет использовать оператор сравнения <
так:
awk '$3 < 40 { print $0 }' information.txt
Вывод:
Thomas Shelby 30 Rio 400
Giorgos Georgiou 35 London 300
Timmy Turner 32 Berlin N/A
В выводе представлена информация о людях моложе 40.
Заключение
Вот и всё. Теперь у вас есть необходимая основа для начала работы с awk
и управления текстовыми данными.
Благодарю за чтение и успехов вам в обучении!
Автор: Дмитрий Брайт