Это руководство рассчитано на новичков, и здесь вы узнаете, что же такое команда awk. Кроме того, вы сможете ознакомиться с тем, как ее можно использовать при работе с текстом.
Приступим!
Что такое команда awk?
awk - это язык описания сценариев. Он поможет вам при работе с командной строкой. Кроме того, эту команды очень часто используют для обработки текста.
С помощью awk вы можете выбирать данные (один или несколько фрагментов текста), опираясь на созданный шаблон.
Например, с помощью awk вы можете выполнять такие операции, как поиск определенного слова или комбинации символов в заданном фрагменте текста или выбор определенной строки или определенного столбца в указанном файле.
Базовый синтаксис команды awk
В самом простом варианте после команды awk следуют набор одинарных кавычек и набор фигурных скобок, в последнюю очередь пишется имя файла, который вы хотите найти.
Это выглядит примерно вот так:
awk '{action}' your_file_name.txt
Если вы хотите найти текст, у которого есть определенный шаблон, или слово в тексте, то внешний вид команды будет следующим:
awk '/regex pattern/{action}' your_file_name.txt
Как создать файл-пример?
Для того, чтобы создать файл в командной строке, вам понадобиться команда touch.
Например, touch filename.txt, где filename – это имя вашего файла.
После чего вы можете воспользоваться командой open (open filename.txt), которая откроет редактор текста, например, TextEdit, где вы сможете добавить содержимое файла.
Итак, предположим, что у вас есть текстовый файл под названием information.txt, в котором хранятся данные, разделенные на несколько столбцов.
Содержимое файла выглядит примерно так:
fristName lastName age city ID
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Wood Tinker 54 Lisbon N/A
Giorgos Georgiou 35 London 300
Timmy Turner 32 Berlin N/A
В данном случае мы имеем столбцы firstName, lastName, age, city и ID.
Вы можете в любое время просмотреть содержимое вашего файла, набрав команду cat text_file, где text_file - это имя вашего файла.
Как напечатать все содержимое файла с помощью команды awk?
Для того, чтобы напечатать все содержимое файла, внутри фигурных скобок необходимо указать действие print $0.
Это будет работать точно также, как команда cat, которую мы упомянули чуть выше.
awk '{print $0}' information.txt
Результат:
fristName lastName age city ID
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Wood Tinker 54 Lisbon N/A
Giorgos Georgiou 35 London 300
Timmy Turner 32 Berlin N/A
Если вы хотите пронумеровать строки, то для этого вам нужна встроенная переменная NR:
awk '{print NR,$0}' information.txt
1 fristName lastName age city ID
2
3 Thomas Shelby 30 Rio 400
4 Omega Night 45 Ontario 600
5 Wood Tinker 54 Lisbon N/A
6 Giorgos Georgiou 35 London 300
7 Timmy Turner 32 Berlin N/A
Как напечатать определенные столбцы с помощью команды awk?
Вы можете указать какие-то конкретные столбцы, которые вы хотите напечатать.
Для того, чтобы напечатать первый столбец, вам потребуется вот такая команда:
awk '{print $1}' information.txt
Результат:
Thomas
Omega
Wood
Giorgos
Timmy
$1 обозначает первое поле данных. В нашем случае это первый столбец.
Для того, чтобы напечатать второй столбец, вам нужно подставить в команду $2:
awk '{print $2}' information.txt
Результат:
lastName
Shelby
Night
Tinker
Georgiou
Turner
Как же команда awk определяет, где начинается и где заканчивается каждый столбец? По умолчанию она это делает по пробелам.
Для того, чтобы напечатать больше, чем один столбец, например, первый и четвертый, вам нужно сделать следующее:
awk '{print $1, $4}' information.txt
Результат:
fristName city
Thomas Rio
Omega Ontario
Wood Lisbon
Giorgos London
Timmy Berlin
$1 - это первое входное поле (первый столбец), а $4 - четвертое. Вы записываете их через запятую ($1, $4). В результате столбцы напечатаются через пробел, что обеспечит их читаемость.
Для того, чтобы напечатать последнее поле данных (последний столбец), вам нужно подставить в команду $NF, что обозначает последнее поле в записи:
awk '{print $NF}' information.txt
Результат:
ID
400
600
N/A
300
N/A
Как напечатать определенные строки столбца?
Помимо всего прочего вы можете выбрать столбец и указать его строки, которые вы хотите напечатать.
awk '{print $1}' information.txt | head -1
Результат:
FirstName
Давайте разберем эту команду поподробнее. Команда awk '{print $1}' information.txt печатает первый столбец. После чего с помощью вертикальной черты вывод этой команды (которую вы наблюдали ранее) передается команде head, где аргумент -1 отвечает за выбор первой сроки столбца.
Если вы хотите напечатать две строки, то команда будет выглядеть вот так:
awk '{print $1}' information.txt | head -2
Результат:
FirstName
Dionysia
Как напечатать строки с помощью специального шаблона?
Вы можете напечатать строку, которая начинается с какой-то определенной буквы.
Например,
awk '/^O/' information.txt
Результат:
Omega Night 45 Ontario 600
Эта команда выбирает все строки, которые начинаются с буквы O.
Для начала вы пишете символ ^, который указывает на то, что строка с этой буквы должна начинаться, после чего вы пишете букву, с которой должна начинаться строка.
Кроме того, вы можете напечатать строку, которая заканчивается определенным образом.
awk '/0$/' information.txt
Результат:
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Giorgos Georgiou 35 London 300
Эта команда печатает все строки, которые заканчиваются на 0. Символ $, записанный после, указывает на то, что строка должна заканчиваться на этот символ.
Команду можно немного изменить:
awk '! /0$/' information.txt
Символ ! используется вместо NOT. То есть в данном случае команда выбирает строки, которые НЕ заканчиваются на 0.
fristName lastName age city ID
Wood Tinker 54 Lisbon N/A
Timmy Turner 32 Berlin N/A
Как использовать регулярные выражения в awk?
Для того, чтобы вывести слова, которые содержат определенные буквы, и напечатать слова, которые соответствуют заданному шаблону, вам снова потребуется пара слешей, которую мы уже видели ранее.
Если вы хотите найти слова, которые содержат io, то вот какую команду вам нужно запустить:
awk ' /io/{print $0}' information.txt
Результат:
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Giorgos Georgiou 35 London 300
В результате вы получите все записи, которые содержат сочетание io.
Допустим, что у вас есть еще один столбец - department:
fristName lastName age city ID department
Thomas Shelby 30 Rio 400 IT
Omega Night 45 Ontario 600 Design
Wood Tinker 54 Lisbon N/A IT
Giorgos Georgiou 35 London 300 Data
Timmy Turner 32 Berlin N/A Engineering
Для того, чтобы найти информацию обо всех людях, которые работают в IT-отделе (IT), вам нужно указать в слешах строку, которую вы ищете:
awk '/IT/' information.txt
Результат:
Thomas Shelby 30 Rio 400 IT
Wood Tinker 54 Lisbon N/A IT
А что делать, если вы хотите увидеть только имя и фамилию людей, которые работают в IT-отделе (IT)?
Вы можете указать соответствующие столбцы:
awk '/IT/{print $1, $2}' information.txt
Результат:
Thomas Shelby
Wood Tinker
В результате на экране отобразятся строки, в которых присутствует IT. Причем, отобразятся не все поля, а только первый и второй столбцы.
Могут возникать ситуации, когда при поиске слов по определенному шаблону, вам может потребоваться символ перехода (escape), например,
awk '/N\/A$/' information.txt
Результат:
Wood Tinker 54 Lisbon N/A
Timmy Turner 32 Berlin N/A
Я хотел найти строки, который заканчиваются на N/A.
И потому, дабы избежать ошибки, записывая N/A, мне пришлось воспользоваться символом перехода (\).
Как использовать операторы сравнения в awk?
Если вы, например, хотите найти информацию о сотрудниках, возраст которых не превышает 40 лет, то вам понадобиться оператор сравнения <:
awk '$3 < 40 { print $0 }' information.txt
Результат:
Thomas Shelby 30 Rio 400
Giorgos Georgiou 35 London 300
Timmy Turner 32 Berlin N/A
В результате вы получите информацию только о сотрудниках младше 40 лет.
Заключение
Вот оно! Теперь вы знаете, что такое awk, и умеете работать с ним и текстовыми данными.