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