0

AWK commands

В этом базовом руководстве вы узнаете самые основы команды 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, содержащий данные, разделённые по столбцам.

Выглядеть этот файл может так:

firstName       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

В приведённом примере мы видим по одному столбцу для
firstNamelastNameagecity и ID.

В любой момент можно просмотреть вывод содержимого вашего файла, выполнив cat text_file, где text_file представляет имя файла.

Вывод всего содержимого файла

Для вывода всего содержимого файла в качестве действия в фигурных скобках нужно указать print $0.

Сработает эта команда аналогично ранее упомянутой cat.

awk '{print $0}' information.txt

Вывод:

firstName       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 firstName     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

Вывод:

firstName city
 
Thomas    Rio
Omega     Ontario
Wood      Lisbon
Giorgos   London
Timmy     Berlin

Здесь $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 

Символ ! используется в качестве приставки «НЕ», а значит, в этом случае будут выбраны строки, которые не оканчиваются на 0.

firstName       lastName        age     city       ID

Wood            Tinker          54      Lisbon     N/A
Timmy           Turner          32      Berlin     N/A

Использование регулярных выражений

Для вывода слов, содержащих определённые буквы, а также слов, соответствующих указанному шаблону, мы снова используем прямые слэши.

К примеру, если нас интересуют слова, содержащие io, мы пишем:

awk ' /io/{print $0}' information.txt

Вывод:

Thomas          Shelby          30      Rio        400
Omega           Night           45      Ontario    600
Giorgos         Georgiou        35      London     300

Мы получили строки, в которых содержатся слова, содержащие io.

Теперь предположим, что в файле есть дополнительный столбец department:

firstName       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, нужно указать искомую строку между //:

awk '/IT/' information.txt

Вывод:

Thomas          Shelby          30      Rio        400  IT
Wood            Tinker          54      Lisbon     N/A  IT

А что, если мы хотим увидеть только имена и фамилии сотрудников из IT?

Тогда можно указать столбец так:

awk '/IT/{print $1, $2}' information.txt

Вывод:

Thomas Shelby
Wood   Tinker

В этом случае отобразятся только первый и второй столбцы строк, содержащих IT.

При поиске слов, содержащих конкретный шаблон, бывают случаи, когда требуется использовать экранирующий символ:

awk '/N\/A$/' information.txt

Вывод:

Wood            Tinker          54      Lisbon     N/A
Timmy           Turner          32      Berlin     N/A

Я хотела найти строки, оканчивающиеся на N/A. Поэтому при указании критериев поиска в ' // ', как это показывалось выше, мне пришлось использовать между N/A символ перехода \. В противном случае возникла бы ошибка.

Использование операторов сравнения

Если вы, предположим, захотите найти всю информацию о сотрудниках в возрасте до 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 и управления текстовыми данными.

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:398 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(845): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(418): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 398