В Linux команда awk
используется в командной строке для обработки текста. Она позволяет выполнять действия над строками в соответствии с заданным шаблоном.
Скриптовый язык awk
не требует компиляции и позволяет пользователю использовать переменные, числовые функции, строковые функции и логические операторы при написании крошечных, но очень эффективных программ.
Содержание
Возможности команды awk
Утилита способна выполнять следующие операции:
- сканирование файла построчно;
- разбиение каждую строку ввода на поля;
- сравнивание строки/поля ввода с образцом;
- действия над совпавшими строками;
- преобразование файлов данных;
- создание форматированных отчетов;
- форматирование строк вывода;
- арифметические и строковые операции;
- условные операторы и циклы.
Синтаксис
awk '{действие}' ваш_файл.txt
Использование команды awk в Linux
Для ознакомления с использованием утилиты создаём простой текстовый файл:
oleg@mobile:~/Directory:$ touch example1.txt
oleg@mobile:~/Directory:$
Наполняем созданный файл текстом и смотрим полученный результат:
oleg@mobile:~/Directory:$ cat example.txt
fristName lastName age city ID
Ivan Ivanov 28 Toronto 400
Peter Petrov 43 Berlin 600
Sidor Sidorov 52 Sofia N/A
Paul Pavlov 33 London 300
Carl Carlson 30 Rome N/A
oleg@mobile:~/Directory:$
В созданном файле 5 столбцов: fristName
, lastName
, age
, city
, ID
.
Вывод содержимого файла
Чтобы вывода всего содержимого файла, внутри фигурных скобок следует указать действие print $0
:
oleg@mobile:~/Directory:$ awk '{print $0}' example.txt
fristName lastName age city ID
Ivan Ivanov 28 Toronto 400
Peter Petrov 43 Berlin 600
Sidor Sidorov 52 Sofia N/A
Paul Pavlov 33 London 300
Carl Carlson 30 Rome N/A
oleg@mobile:~/Directory:$
Счётчик номеров строк
Для того чтобы каждая строка имела счетчик номеров строк, следует использовать встроенную переменную NR
:
oleg@mobile:~/Directory:$ awk '{print NR,$0}' example.txt
1 fristName lastName age city ID
2
3 Ivan Ivanov 28 Toronto 400
4 Peter Petrov 43 Berlin 600
5 Sidor Sidorov 52 Sofia N/A
6 Paul Pavlov 33 London 300
7 Carl Carlson 30 Rome N/A
oleg@mobile:~/Directory:$
Вывод определённых столбцов
При использовании команды awk
можно указать в выводе лишь определённые столбцы. Для примера выводим первый столбец:
oleg@mobile:~/Directory:$ awk '{print $1}' example.txt
fristName
Ivan
Peter
Sidor
Paul
Carl
oleg@mobile:~/Directory:$
Для вывода второго столбца используется, естественно, $2
:
oleg@mobile:~/Directory:$ awk '{print $2}' example.txt
lastName
Ivanov
Petrov
Sidorov
Pavlov
Carlson
oleg@mobile:~/Directory:$
Для вывода более одного столбца, например, первого, второго и четвертого выполняется следующее:
oleg@mobile:~/Directory:$ awk '{print $1, $2, $4}' example.txt
fristName lastName city
Ivan Ivanov Toronto
Peter Petrov Berlin
Sidor Sidorov Sofia
Paul Pavlov London
Carl Carlson Rome
oleg@mobile:~/Directory:$
Для вывода последнего столбца можно использовать $NF
, представляющее последнее поле в записи:
oleg@mobile:~/Directory:$ awk '{print $NF}' example.txt
ID
400
600
N/A
300
N/A
oleg@mobile:~/Directory:$
Вывод определённых строк
Можно выводить и определённые строки, например, из выбранного столбца. Для примера выводим первую строку первого столбца:
oleg@mobile:~/Directory:$ awk '{print $NF}' example.txt
ID
400
600
N/A
300
N/A
oleg@mobile:~/Directory:$
Разберём выполненную команду. awk '{print $1}' example.txt
вывела первый столбец. Затем выходные данные этой команды были переданы с помощью символа вертикальной черты |
в команду head
, где её аргумент -1
выбрал первую строку столбца.
Следовательно, при желании вывести две строки, например первую и вторую необходимо выполнить следующее:
oleg@mobile:~/Directory:$ awk '{print $1}' example.txt | head -2
fristName
oleg@mobile:~/Directory:$
Обратите внимание на то, что вторая строка пробельная.
Вывод строк с определённым шаблоном
oleg@mobile:~/Directory:$ awk '/^P/' example.txt
Peter Petrov 43 Berlin 600
Paul Pavlov 33 London 300
oleg@mobile:~/Directory:$
Команды выбрала в нашем файле, две строки, начинающиеся с буквы P
, а символом стрелки вверх ^
было указано начало строки.
Можно также вывести строки, заканчивающиеся определённым шаблоном:
oleg@mobile:~/Directory:$ awk '/0$/' example.txt
Ivan Ivanov 28 Toronto 400
Peter Petrov 43 Berlin 600
Paul Pavlov 33 London 300
oleg@mobile:~/Directory:$
Эту команду также можно изменить следующим образом:
oleg@mobile:~/Directory:$ awk '! /0$/' example.txt
fristName lastName age city ID
Sidor Sidorov 52 Sofia N/A
Carl Carlson 30 Rome N/A
oleg@mobile:~/Directory:$
Теперь были выведены строки не заканчивающиеся на 0
, так как символ !
используется как NOT.
Использование регулярных выражений
Для вывода слов, содержащих определённые буквы, соответствующие указанному шаблону, используется слеш /
. Например, для вывода слов, содержащих Pa
, выполняется следующее:
oleg@mobile:~/Directory:$ awk ' /Pa/{print $0}' examle.txt
Paul Pavlov 33 London 300
oleg@mobile:~/Directory:$
В выводе мы получили все строки, содержащие Pa
.
Использование операторов сравнения
Для получения, например, всей информации о сотрудниках моложе 35 лет оператор сравнения используются следующим образом:
oleg@mobile:~/Directory:$ awk ' /Pa/{print $0}' examle.txt
Paul Pavlov 33 London 300
oleg@mobile:~/Directory:$
Команда показала в выводе всех сотрудников моложе 35 лет.
Заключение
Здесь были изложены лишь основы работы в Linux с командой awk
. Теперь зная их вы сможете углублять свои навыки работы с этой очень мощной утилитой.