Фильтруем вывод с помощью awk

В этой статье разбираемся с командой 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) по этой команде можете почитать здесь.




Другие мои статьи по работе в командной строке можете посмотреть здесь.



2023-09-13T10:40:32
Программирование на Bash