В этой статье разбираемся с командой awk. Научимся выводить определённые столбцы и строки, добавлять к выводу номера строк и другому.
Синтаксис
Если упростить синтаксис команды awk, то получим что-то вроде этого:
awk (опции) (условие) '{ команда }'
Команды
В этой статье будет рассмотрена только одна команда '{print}' — она позволяет что-то выводить на экран терминала.
Например мы можем вывести на экран определённый столбец. Столбцы обозначаются с помощью:
- $0 — все столбцы;
- $1 — первый столбец;
- $2 — второй столбец;
- $NF — последний столбец.
$ cat test.txt
123 234 345 456 567
qwe wer ert rty tyu
asd sdf dfg fgh ghj
zxc xcv cvb vbn bnm
$ cat test.txt | awk '{print $0}'
123 234 345 456 567
qwe wer ert rty tyu
asd sdf dfg fgh ghj
zxc xcv cvb vbn bnm
$ cat test.txt | awk '{print $1}'
123
qwe
asd
zxc
$ cat test.txt | awk '{print $NF}'
567
tyu
ghj
bnm
К выводу можно добавить номер строки. Номер строки в awk обозначается с помощью NR, например:
$ cat test.txt | awk '{print NR, $0}'
1 123 234 345 456 567
2 qwe wer ert rty tyu
3 asd sdf dfg fgh ghj
4 zxc xcv cvb vbn bnm
Например, отфильтруем вывод команды df, чтобы получить только точки монтирования и процент доступного пространства:
$ df | awk '{print $6, $5}'
Использовано% Доступно
/dev 0%
/run 1%
/ 28%
/dev/shm 0%
/run/lock 1%
/run/user/1000 0%
Условия
С помощью условия можно вывести определённую строку, делается это так:
- ‘NR==1’ — показать первую строку;
- ‘NR==2’ — показать вторую строку;
- ‘NR>1’ — вывести все строки, начиная со второй;
- ‘NR==2;NR==11’; — вывести 2 и 11 строки;
- ‘NR==2,NR==11’ — вывести строки со 2-ой по 11-ую.
$ cat test.txt 123 234 345 456 567 qwe wer ert rty tyu asd sdf dfg fgh ghj zxc xcv cvb vbn bnm $ cat test.txt | awk 'NR==2' qwe wer ert rty tyu $ cat test.txt | awk 'NR>1' qwe wer ert rty tyu asd sdf dfg fgh ghj zxc xcv cvb vbn bnm
Еще с помощью условия мы можем найти строку в которой содержится подстрока. Это похоже на работу команды grep. Для этого нужно задать подстроку в виде — /'подстрока'/. Например так:
$ cat test.txt | awk ' /'qwe'/ ' qwe wer ert rty tyu
Можем вывести информацию по определённому пользователю из файла /etc/passwd:
$ cat /etc/passwd | awk ' /'alex'/ ' alex:x:1000:1000:alex,,,:/home/alex:/bin/bash
Комбинирование условий и команд
В одной команде awk мы можем комбинировать условия и команды.
Например, отфильтруем вывод команды free, чтобы получить только первый и четвёртый столбцы из второй строки:
$ free | awk 'NR==2 {print $1, $4}'
Mem: 624600
Или сделаем тоже самое, но выводить будем не вторую строку, а строку содержащую ‘Mem’:
$ free | awk ' /'Mem'/ {print $1, $4} '
Mem: 624576
Опции
У команды awk есть опция -F, которая позволяет задать произвольный разделитель. Например в файле /etc/passwd разделителем считается двоеточие (:).
Давайте получим первый, третий и четвёртый поля (имя пользователя, uid, gid) из файла /etc/passwd:
$ cat /etc/passwd | awk -F ':' '{print $1, $3, $4}'
root 0 0
daemon 1 1
bin 2 2
sys 3 3
sync 4 65534
games 5 60
man 6 12
lp 7 7
mail 8 8
news 9 9
uucp 10 10
Сделаем тоже самое, но найдем строку для нашего пользователя (alex):
$ cat /etc/passwd | awk -F ':' ' /'alex'/ {print $1, $3, $4} '
alex 1000 1000
Итог
С помощью команды awk мы можем:
- вывести определённый столбец;
- вывести определённую строку;
- добавить к выводу номера строк;
- получить строку содержащую подстроку;
- изменять разделитель;
- и всё это сочетать.
Документацию (man) по этой команде можете почитать здесь.
Другие мои статьи по работе в командной строке можете посмотреть здесь.