Linux awk работа со строками

Использование awk в Linux

Текст это сердце Unix. Философия «все есть файл» полностью пронизывает всю систему и разработанные для нее инструменты. Вот почему работа с текстом является одним из обязательных навыков не только системного администратора, но и обычного пользователя Linux, который хочет поглубже разобраться в этой операционной системе.

Команда awk — один из самых мощных инструментов для обработки и фильтрации текста, доступный даже для людей никак не связных с программированием. Это не просто утилита, а целый язык разработанный для обработки и извлечения данных. В этой статье мы разберемся как пользоваться awk.

Синтаксис команды awk

Сначала надо понять как работает утилита. Она читает документ по одной строке за раз, выполняет указанные вами действия и выводит результат на стандартный вывод. Одна из самых частых задач, для которых используется awk — это выборка одной из колонок. Все параметры awk находятся в кавычках, а действие, которое надо выполнить — в фигурных скобках. Вот основной её синтаксис:

$ awk опции ‘ условие < действие >‘

$ awk опции ‘ условие < действие >условие < действие >‘

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

  • -F, —field-separator — разделитель полей, используется для разбиения текста на колонки;
  • -f, —file — прочитать данные не из стандартного вывода, а из файла;
  • -v, —assign — присвоить значение переменной, например foo=bar;
  • -b, —characters-as-bytes — считать все символы однобайтовыми;
  • -d, —dump-variables — вывести значения всех переменных awk по умолчанию;
  • -D, —debug — режим отладки, позволяет вводить команды интерактивно с клавиатуры;
  • -e, —source — выполнить указанный код на языке awk;
  • -o, —pretty-print — вывести результат работы программы в файл;
  • -V, —version — вывести версию утилиты.

Это далеко не все опции awk, однако их вам будет достаточно на первое время. Теперь перечислим несколько функций-действий , которые вы можете использовать:

  • print(строка) — вывод чего либо в стандартный поток вывода;
  • printf(строка) — форматированный вывод в стандартный поток вывода;
  • system(команда) — выполняет команду в системе;
  • length(строка) — возвращает длину строки;
  • substr(строка, старт, количество) — обрезает строку и возвращает результат;
  • tolower(строка) — переводит строку в нижний регистр;
  • toupper(строка) — переводить строку в верхний регистр.

Функций намного больше, но чтобы не загромождать статью я привел только те, которые мы будем использовать сегодня, а также ещё несколько для чтобы вы могли оценить масштаб возможностей утилиты.

Читайте также:  Linux как прочитать файл

В функциях-действиях можно использовать различные переменные и операторы, вот несколько из них:

  • FNR — номер обрабатываемой строки в файле;
  • FS — разделитель полей;
  • NF — количество колонок в данной строке;
  • NR — общее количество строк в обрабатываемом тексте;
  • RS — разделитель строк, по умолчанию символ новой строки;
  • $ — ссылка на колонку по номеру.

Кроме этих переменных, есть и другие, а также можно объявлять свои.

Условие позволяет обрабатывать только те строки, в которых содержатся нужные нам данные, его можно использовать в качестве фильтра, как grep. А ещё условие позволяет выполнять определенные блоки кода awk для начала и конца файла, для этого вместо регулярного выражения используйте директивы BEGIN (начало) и END (конец). Там ещё есть очень много всего, но на сегодня пожалуй достаточно. Теперь давайте перейдем к примерам.

Использование awk в Linux

Простейшая и часто востребованная задача — выборка полей из стандартного вывода. Вы не найдете более подходящего инструмента для решения этой задачи, чем awk. По умолчанию awk разделяет поля пробелами. Если вы хотите напечатать первое поле, вам нужно просто использовать функцию print и передать ей параметр $1, если функция одна, то скобки можно опустить:

echo ‘one two three four’ | awk »

Да, использование фигурных скобок немного непривычно, но это только в первое время. Вы уже догадались как напечатать второе, третье, четвертое, или другие поля? Правильно это $2, $3, $4 соответственно.

echo ‘one two three four’ | awk »

Иногда необходимо представить данные в определенном формате, например, выбрать несколько слов. AWK легко справляется с группировкой нескольких полей и даже позволяет включать статические данные:

echo ‘one two three four’ | awk »

Если поля разделены не пробелами, а другим разделителем, просто укажите в параметре -F нужный разделитель в кавычках, например «:» :

echo ‘one mississippi:two mississippi:three mississippi:four mississippi’ | awk -F»:» »

Но разделитель не обязательно заключать в кавычки. Следующий вывод аналогичен предыдущему:

echo ‘one mississippi:two mississippi:three mississippi:four mississippi’ | awk -F: »

Иногда нужно обработать данные с неизвестным количеством полей. Если вам нужно выбрать последнее поле можно воспользоваться переменной $NF. Вот так вы можете вывести последнее поле:

echo ‘one two three four’ | awk »

Также вы можете использовать переменную $NF для получения предпоследнего поля:

echo ‘one two three four’ | awk »

echo ‘one two three four five’ | awk »

Все это можно сделать с помощью таких утилит как sed, cut и grep но это будет намного сложнее.

Как я рассказывал выше, awk обрабатывает одну строку за раз, вот этому подтверждение:

А вот пример фильтрации с помощью условия, выведем только строку, в которой содержится текст one:

Читайте также:  Define java home linux

echo -e ‘one 1\n two 2’ | awk ‘/one/ ‘

А вот пример использования операций с переменными:

echo -e ‘one 1\n two 2’ | awk ‘ END ‘

Это означает что мы должны выполнять следующий блок кода для каждой строки. Это можно использовать, например, для подсчета количества переданных данных по запросам из журнала веб-сервера.

Представьте себе, у нас есть журнал доступа, который выглядит так:

Мы можем подсчитать, что количество переданных байт, это десятое поле. Дальше идёт User-Agent пользователя и он нам не интересен:

cat /var/log/apache2/access.log | awk »

Вот так можно подсчитать количество байт:

Это только несколько примеров показывающих использование awk в Linux , освоив awk один раз в получите очень мощный и полезный инструмент на всю жизнь.

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Источник

Команда awk в Linux

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

Примеры использования команды awk в Linux

Скриптовый язык awk не требует компиляции и позволяет пользователю использовать переменные, числовые функции, строковые функции и логические операторы при написании крошечных, но очень эффективных программ.

Возможности команды awk

Утилита способна выполнять следующие операции:

  • сканирование файла построчно;
  • разбиение каждую строку ввода на поля;
  • сравнивание строки/поля ввода с образцом;
  • действия над совпавшими строками;
  • преобразование файлов данных;
  • создание форматированных отчетов;
  • форматирование строк вывода;
  • арифметические и строковые операции;
  • условные операторы и циклы.

Синтаксис

Использование команды awk в Linux

Для ознакомления с использованием утилиты создаём простой текстовый файл:

oleg@mobile:~/Directory:$ touch example1.txt oleg@mobile:~/Directory:$

Наполняем созданный файл текстом и смотрим полученный результат:

oleg@mobile:~/Directory:$ cat example.txt fristName lastName age city ID Ivan Ivanov 28 Toronto 400 Peter Petrov 43 Berlin 600 Sidor Sidorov 52 Sofia N/A Paul Pavlov 33 London 300 Carl Carlson 30 Rome N/A oleg@mobile:~/Directory:$

В созданном файле 5 столбцов: fristName , lastName , age , city , ID .

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

Чтобы вывода всего содержимого файла, внутри фигурных скобок следует указать действие print $0 :

oleg@mobile:~/Directory:$ awk '' example.txt fristName lastName age city ID Ivan Ivanov 28 Toronto 400 Peter Petrov 43 Berlin 600 Sidor Sidorov 52 Sofia N/A Paul Pavlov 33 London 300 Carl Carlson 30 Rome N/A oleg@mobile:~/Directory:$

Счётчик номеров строк

Для того чтобы каждая строка имела счетчик номеров строк, следует использовать встроенную переменную NR :

oleg@mobile:~/Directory:$ awk '' example.txt 1 fristName lastName age city ID 2 3 Ivan Ivanov 28 Toronto 400 4 Peter Petrov 43 Berlin 600 5 Sidor Sidorov 52 Sofia N/A 6 Paul Pavlov 33 London 300 7 Carl Carlson 30 Rome N/A oleg@mobile:~/Directory:$ 

Вывод определённых столбцов

При использовании команды awk можно указать в выводе лишь определённые столбцы. Для примера выводим первый столбец:

oleg@mobile:~/Directory:$ awk '' example.txt fristName Ivan Peter Sidor Paul Carl oleg@mobile:~/Directory:$

Для вывода второго столбца используется, естественно, $2 :

oleg@mobile:~/Directory:$ awk '' example.txt lastName Ivanov Petrov Sidorov Pavlov Carlson oleg@mobile:~/Directory:$

Для вывода более одного столбца, например, первого, второго и четвертого выполняется следующее:

oleg@mobile:~/Directory:$ awk '' example.txt fristName lastName city Ivan Ivanov Toronto Peter Petrov Berlin Sidor Sidorov Sofia Paul Pavlov London Carl Carlson Rome oleg@mobile:~/Directory:$

Для вывода последнего столбца можно использовать $NF , представляющее последнее поле в записи:

oleg@mobile:~/Directory:$ awk '' example.txt ID 400 600 N/A 300 N/A oleg@mobile:~/Directory:$

Вывод определённых строк

Можно выводить и определённые строки, например, из выбранного столбца. Для примера выводим первую строку первого столбца:

oleg@mobile:~/Directory:$ awk '' example.txt ID 400 600 N/A 300 N/A oleg@mobile:~/Directory:$

Разберём выполненную команду. awk » example.txt вывела первый столбец. Затем выходные данные этой команды были переданы с помощью символа вертикальной черты | в команду head , где её аргумент -1 выбрал первую строку столбца.

Читайте также:  Linux set permission on directory

Следовательно, при желании вывести две строки, например первую и вторую необходимо выполнить следующее:

oleg@mobile:~/Directory:$ awk '' example.txt | head -2 fristName oleg@mobile:~/Directory:$

Обратите внимание на то, что вторая строка пробельная.

Вывод строк с определённым шаблоном

oleg@mobile:~/Directory:$ awk '/^P/' example.txt Peter Petrov 43 Berlin 600 Paul Pavlov 33 London 300 oleg@mobile:~/Directory:$

Команды выбрала в нашем файле, две строки, начинающиеся с буквы P , а символом стрелки вверх ^ было указано начало строки.

Можно также вывести строки, заканчивающиеся определённым шаблоном:

oleg@mobile:~/Directory:$ awk '/0$/' example.txt Ivan Ivanov 28 Toronto 400 Peter Petrov 43 Berlin 600 Paul Pavlov 33 London 300 oleg@mobile:~/Directory:$

Эту команду также можно изменить следующим образом:

oleg@mobile:~/Directory:$ awk '! /0$/' example.txt fristName lastName age city ID Sidor Sidorov 52 Sofia N/A Carl Carlson 30 Rome N/A oleg@mobile:~/Directory:$

Теперь были выведены строки не заканчивающиеся на 0 , так как символ ! используется как NOT.

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

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

oleg@mobile:~/Directory:$ awk ' /Pa/' examle.txt Paul Pavlov 33 London 300 oleg@mobile:~/Directory:$

В выводе мы получили все строки, содержащие Pa .

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

Для получения, например, всей информации о сотрудниках моложе 35 лет оператор сравнения используются следующим образом:

oleg@mobile:~/Directory:$ awk ' /Pa/' examle.txt Paul Pavlov 33 London 300 oleg@mobile:~/Directory:$

Команда показала в выводе всех сотрудников моложе 35 лет.

Заключение

Здесь были изложены лишь основы работы в Linux с командой awk . Теперь зная их вы сможете углублять свои навыки работы с этой очень мощной утилитой.

Источник

Оцените статью
Adblock
detector