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

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

Сводка
Фильтруем вывод с помощью awk
Имя статьи
Фильтруем вывод с помощью awk
Описание
В этой статье разбираемся с командой awk. Научимся выводить определённые столбцы и строки, добавлять к выводу номера строк и другому

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *