20 примеров awk

20 Awk Examples



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

Содержание:

  1. awk с printf
  2. awk разделить на пустое пространство
  3. awk, чтобы изменить разделитель
  4. awk с данными, разделенными табуляцией
  5. awk с данными CSV
  6. регулярное выражение awk
  7. регулярное выражение без учета регистра в awk
  8. awk с переменной nf (количество полей)
  9. функция awk gensub ()
  10. awk с функцией rand ()
  11. пользовательская функция awk
  12. awk если
  13. переменные awk
  14. массивы awk
  15. цикл awk
  16. awk для печати первого столбца
  17. awk для печати последнего столбца
  18. awk с grep
  19. awk с файлом сценария bash
  20. awk с sed

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

printf () Функция используется для форматирования любого вывода на большинстве языков программирования. Эту функцию можно использовать с awk команда для генерации различных типов форматированных выходных данных. Команда awk в основном используется для любого текстового файла. Создайте текстовый файл с именем employee.txt с приведенным ниже содержанием, где поля разделены табуляцией (‘ t’).







employee.txt



1001 Джон сена 40000
1002 Джафар Икбал 60000
1003 Мехер Нигяр 30000
1004 Джонни Ливер 70000

Следующая команда awk будет читать данные из employee.txt файл построчно и распечатайте первое поле после форматирования. Здесь, % 10s n означает, что вывод будет состоять из 10 символов. Если значение вывода меньше 10 символов, то перед значением будут добавлены пробелы.



$ awk'{printf'% 10s п', $ 1}'работник.текст

Выход:





Перейти к содержанию



awk разделить на пустое пространство

Разделителем слов или полей по умолчанию для разделения любого текста является пробел. Команда awk может принимать текстовое значение в качестве входных данных различными способами. Вводимый текст передается из выбросил в следующем примере. Текст, ' Мне нравится программировать ’Будет разделен разделителем по умолчанию, Космос , и третье слово будет напечатано как вывод.

$выбросил 'Я люблю программировать' | awk '{печать $ 3}'

Выход:

Перейти к содержанию

awk, чтобы изменить разделитель

Команда awk может использоваться для изменения разделителя для любого содержимого файла. Предположим, у вас есть текстовый файл с именем phone.txt со следующим содержимым, где ‘:’ используется как разделитель полей содержимого файла.

phone.txt

+123: 334: 889: 778
+880: 1855: 456: 907
+9: 7777: 38644: 808

Выполните следующую команду awk, чтобы изменить разделитель, ‘:’ к ‘-’ к содержанию файла, phone.txt .

$ cat phone.txt
$ awk '$ 1 = $ 1' FS = ':' OFS = '-' phone.txt

Выход:

Перейти к содержанию

awk с данными, разделенными табуляцией

Команда awk имеет множество встроенных переменных, которые используются для чтения текста разными способами. Двое из них FS а также OFS . FS является разделителем поля ввода и OFS - переменные-разделители выходных полей. В этом разделе показано использование этих переменных. Создать вкладка отдельный файл с именем input.txt со следующим содержанием для тестирования использования FS а также OFS переменные.

Input.txt

Клиентский язык сценариев
Язык сценариев на стороне сервера
Сервер базы данных
Веб сервер

Использование переменной FS с вкладкой

Следующая команда разделит каждую строку input.txt файл на основе вкладки (‘ t’) и распечатайте первое поле каждой строки.

$awk '{печать $ 1}' FSзнак равно' т'input.txt

Выход:

Использование переменной OFS с вкладкой

Следующая команда awk напечатает 9th а также 5th поля ‘Ls -l’ вывод команды с разделителем табуляции после печати заголовка столбца Имя а также Размер . Здесь, OFS переменная используется для форматирования вывода с помощью табуляции.

$ls -
$ls - | awk -v OFSзнак равно' т' 'BEGIN {printf'% s t% s n ',' Name ',' Size '} {print $ 9, $ 5}'

Выход:

Перейти к содержанию

awk с данными CSV

Содержимое любого CSV-файла можно проанализировать несколькими способами с помощью команды awk. Создайте файл CSV с именем ‘ customer.csv ’Со следующим содержимым, чтобы применить команду awk.

customer.txt

Идентификатор, имя, адрес электронной почты, телефон
1, София, [адрес электронной почты защищен], (862) 478-7263
2, Амелия, [адрес электронной почты защищен], (530) 764-8000
3, Эмма, [адрес электронной почты защищен], (542) 986-2390

Чтение одного поля файла CSV

‘-F’ опция используется с командой awk для установки разделителя для разделения каждой строки файла. Следующая команда awk напечатает имя поле the customer.csv файл.

$Котcustomer.csv
$awk -F ',' '{печать $ 2}'customer.csv

Выход:

Чтение нескольких полей путем объединения с другим текстом

Следующая команда напечатает три поля customer.csv комбинируя текст заголовка, Имя, адрес электронной почты и телефон . Первая строка customer.csv файл содержит заголовок каждого поля. НЕТ переменная содержит номер строки файла, когда команда awk анализирует файл. В этом примере NR переменная используется для пропуска первой строки файла. На выходе будет показано 2nd, 3rdи 4thполя всех строк, кроме первой.

$awk -F ',' 'NR> 1 {print' Имя: '2 доллара США', электронная почта: '3 доллара США', телефон: '4 доллара США}'customer.csv

Выход:

Чтение файла CSV с помощью сценария awk

Сценарий awk можно запустить, запустив файл awk. В этом примере показано, как создать файл awk и запустить его. Создайте файл с именем awkcsv.awk со следующим кодом. НАЧИНАТЬ ключевое слово используется в сценарии для информирования команды awk о выполнении сценария НАЧИНАТЬ сначала часть перед выполнением других задач. Здесь разделитель полей ( FS ) используется для определения разделителя разделения и 2ndи 1улполя будут напечатаны в соответствии с форматом, используемым в функции printf ().

awkcsv.awk
НАЧИНАТЬ{FSзнак равно ','} { printf '% 5s (% s) п',$2,$1}

Запустить awkcsv.awk файл с содержанием the customer.csv файл с помощью следующей команды.

$awk -fawkcsv.awk customer.csv

Выход:

Перейти к содержанию

регулярное выражение awk

Регулярное выражение - это шаблон, который используется для поиска любой строки в тексте. С помощью регулярного выражения можно очень легко выполнить различные типы сложных задач поиска и замены. В этом разделе показаны некоторые простые способы использования регулярного выражения с командой awk.

Соответствующий персонажустановленный

Следующая команда будет соответствовать слову Дурак или буг или Прохладный со входной строкой и выведите, если слово найдено. Здесь, Кукла не будет совпадать и не печатать.

$printf 'Дурак пПрохладный пКукла пбулево | awk '/ [FbC] ool /'

Выход:

Строка поиска в начале строки

‘^’ символ используется в регулярном выражении для поиска любого шаблона в начале строки. ‘ Linux ’ слово будет искать в начале каждой строки текста в следующем примере. Здесь две строки начинаются с текста, ‘Linux ’, И эти две строки будут показаны на выходе.

$выбросил -А также 'Linux можно использовать бесплатно пЭто программное обеспечение с открытым исходным кодом. пLinuxHint - это
популярный блог-сайт '
| awk '/ ^ Linux /'

Выход:

Строка поиска в конце строки

‘$’ Символ используется в регулярном выражении для поиска любого шаблона в конце каждой строки текста. ‘ Сценарий 'Слово ищется в следующем примере. Здесь две строки содержат слово, Сценарий в конце строки.

$выбросил -А также 'PHP-скрипт пJavaScript пВизуальное программирование ' | awk '/ Скрипт $ /'

Выход:

Поиск с пропуском определенного набора символов

‘^’ символ указывает начало текста, когда он используется перед любым строковым шаблоном (‘/ ^… /’) или перед любым набором символов, объявленным ^ […] . Если ‘^’ символ используется внутри третьей скобки, [^…] тогда определенный набор символов внутри скобки будет опущен во время поиска. Следующая команда будет искать любое слово, которое не начинается с ‘F’ но заканчивающийся на ' оол '. Прохладный а также bool будут напечатаны в соответствии с шаблоном и текстовыми данными.

$ printf 'Дурак пПрохладный пКукла пбулево |awk'/ [^ F] оол /'

Выход:

Перейти к содержанию

регулярное выражение без учета регистра в awk

По умолчанию регулярное выражение выполняет поиск с учетом регистра при поиске любого шаблона в строке. Поиск без учета регистра может выполняться командой awk с регулярным выражением. В следующем примере снизить() Функция используется для поиска без учета регистра. Здесь первое слово каждой строки входного текста будет преобразовано в нижний регистр с использованием снизить() функция и совпадение с шаблоном регулярного выражения. toupper () Для этой цели также можно использовать функцию, в этом случае образец должен определяться заглавными буквами. Текст, определенный в следующем примере, содержит искомое слово, 'Интернет ’В две строки, которые будут напечатаны как результат.

$выбросил -А также 'Веб-дизайн пВеб-разработка пФреймворк' | awk 'tolower ($ 0) ~ / ^ web /;'

Выход:

Перейти к содержанию

awk с переменной NF (количество полей)

NF - встроенная переменная команды awk, которая используется для подсчета общего количества полей в каждой строке входного текста. Создайте любой текстовый файл с несколькими строками и несколькими словами. input.txt здесь используется файл, созданный в предыдущем примере.

Использование NF из командной строки

Здесь первая команда используется для отображения содержимого input.txt файл, а вторая команда используется для отображения общего количества полей в каждой строке файла, используя NF Переменная.

$ cat input.txt
$ awk '{print NF}' input.txt

Выход:

Использование NF в файле awk

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

count.awk

{print $0}
{Распечатать'[Всего полей:'NF']'}

Запустите сценарий с помощью следующей команды.

$awk -fcount.awk input.txt

Выход:

Перейти к содержанию

функция awk gensub ()

getsub () - это функция подстановки, которая используется для поиска строки на основе определенного разделителя или шаблона регулярного выражения. Эта функция определена в 'Таращиться' пакет, который не установлен по умолчанию. Синтаксис этой функции приведен ниже. Первый параметр содержит шаблон регулярного выражения или разделитель поиска, второй параметр содержит текст замены, третий параметр указывает, как будет выполняться поиск, а последний параметр содержит текст, в котором будет применяться эта функция.

Синтаксис:

gensub(регулярное выражение, замена, как[, цель])

Выполните следующую команду для установки таращиться пакет для использования getsub () функция с командой awk.

$ sudo apt-get install gawk

Создайте текстовый файл с именем ‘ salesinfo.txt ’Со следующим содержанием, чтобы попрактиковаться в этом примере. Здесь поля разделены табуляцией.

salesinfo.txt

Мой 700000
Ваш 800000
Ср 750000
Собрать 200000
Пт 430000
Сб 820000

Выполните следующую команду, чтобы прочитать числовые поля salesinfo.txt файл и распечатайте общую сумму продаж. Здесь третий параметр, «G», указывает на глобальный поиск. Это означает, что поиск шаблона будет выполняться во всем содержимом файла.

$awk '{х = gensub (' t ',' ',' G ', $ 2); printf x '+'} END {печать 0} 'salesinfo.txt| до н.э -

Выход:

Перейти к содержанию

awk с функцией rand ()

ряд() функция используется для генерации любого случайного числа больше 0 и меньше 1. Таким образом, она всегда будет генерировать дробное число меньше 1. Следующая команда сгенерирует дробное случайное число и умножит значение на 10, чтобы получить число больше, чем 1. Для применения функции printf () будет напечатано дробное число с двумя цифрами после десятичной точки. Если вы выполните следующую команду несколько раз, каждый раз вы будете получать разные выходные данные.

$awk 'BEGIN {printf' Число =%. 2f n ', rand () * 10}'

Выход:

Перейти к содержанию

пользовательская функция awk

Все функции, использованные в предыдущих примерах, являются встроенными функциями. Но вы можете объявить пользовательскую функцию в своем сценарии awk для выполнения любой конкретной задачи. Предположим, вы хотите создать специальную функцию для вычисления площади прямоугольника. Для выполнения этой задачи создайте файл с именем ‘ area.awk ’Со следующим сценарием. В этом примере пользовательская функция с именем площадь() объявлен в скрипте, который вычисляет площадь на основе входных параметров и возвращает значение площади. Getline Команда используется здесь для получения ввода от пользователя.

area.awk

# Рассчитать площадь
функцияплощадь(рост,ширина){
возвращениерост*ширина
}

# Запускает выполнение
НАЧИНАТЬ{
Распечатать'Введите значение высоты:'
Getline H< '-'
Распечатать'Введите значение ширины:'
Getline W< '-'
Распечатать'Площадь ='площадь(час,в)
}

Запускаем скрипт.

$awk -farea.awk

Выход:

Перейти к содержанию

awk если пример

awk поддерживает условные операторы, как и другие стандартные языки программирования. В этом разделе на трех примерах показаны три типа операторов if. Создайте текстовый файл с именем items.txt со следующим содержанием.

items.txt

Жесткий диск Samsung $ 100
Мышь A4Tech
Принтер HP $ 200

Простой пример if :

следующая команда прочитает содержимое items.txt файл и проверьте 3rd значение поля в каждой строке. Если значение пусто, будет выведено сообщение об ошибке с номером строки.

$awk '{if ($ 3 ==' ') print' В строке 'NR} отсутствует поле цены'items.txt

Выход:

if-else пример:

Следующая команда напечатает цену товара, если 3rdполе существует в строке, иначе будет выведено сообщение об ошибке.

$ awk'{if ($ 3 ==' ') print' Поле цены отсутствует '
иначе напечатайте 'цена товара' $ 3} '
Предметы.текст

Выход:

if-else-if пример:

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

$awk 'BEGIN {print' Введите отметку: '
отметка Getline<'-'
if (mark> = 90) выведите 'A +'
иначе, если (отметка> = 80) напечатайте 'A'
иначе, если (отметка> = 70) выведите 'B +'
else print 'Fail'} '

Выход:

Перейти к содержанию

переменные awk

Объявление переменной awk аналогично объявлению переменной оболочки. Есть разница в чтении значения переменной. Символ «$» используется с именем переменной, чтобы переменная оболочки считывала значение. Но нет необходимости использовать «$» с переменной awk для чтения значения.

Используя простую переменную:

Следующая команда объявит переменную с именем 'сайт' и этой переменной присваивается строковое значение. Значение переменной печатается в следующем операторе.

$awk 'НАЧАТЬ {site =' LinuxHint.com '; сайт печати} '

Выход:

Использование переменной для извлечения данных из файла

Следующая команда будет искать слово «Принтер» в файле items.txt . Если какая-либо строка файла начинается с ‘Принтер ’Тогда он сохранит значение 1ул , 2nd а также 3rd поля на три переменные. имя а также цена переменные будут напечатаны.

$ awk'/ Принтер / {name = $ 1; brand = $ 2; price = $ 3; print' item name = 'name;
напечатать 'item price =' price} '
Предметы.текст

Выход:

Перейти к содержанию

массивы awk

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

Ассоциативный массив:

Индексом массива будет любая строка для ассоциативного массива. В этом примере объявляется и печатается ассоциативный массив из трех элементов.

$awk 'НАЧИНАТЬ {
books ['Web Design'] = 'Изучение HTML 5';
books ['Веб-программирование'] = 'PHP и MySQL'
books ['PHP Framework'] = 'Изучение Laravel 5'
printf '% s n% s n% s n', книги ['Веб-дизайн'], книги ['Веб-программирование'],
книги ['PHP Framework']} '

Выход:

Числовой массив:

Числовой массив из трех элементов объявляется и печатается разделением табуляции.

$ awk'НАЧИНАТЬ {
число [0] = 80;
число [1] = 55;
число [2] = 76;

# выводить элементы массива
printf 'Значения массива:% d т% d т% d п', число [0], число [1], число [2]; } '

Выход:

Перейти к содержанию

цикл awk

Awk поддерживает три типа циклов. Использование этих циклов показано здесь на трех примерах.

Пока цикл:

Цикл while, который используется в следующей команде, будет повторяться 5 раз и выйдет из цикла для оператора break.

$ awk 'НАЧАТЬ {n = 1; в то время как (n 5) перерыв; print n; n ++}} '

Выход:

Для цикла:

Цикл For, который используется в следующей команде awk, вычислит сумму от 1 до 10 и распечатает значение.

$awk 'НАЧАТЬ {сумма = 0; для (n = 1; n<= 10; n++) sum=sum+n; print sum }'

Выход:

Цикл Do-while:

цикл do-while следующей команды напечатает все четные числа от 10 до 5.

$awk 'НАЧАТЬ {counter = 10; do {if (counter% 2 == 0) print counter; прилавок-- }
while (counter> 5)} '

Выход:

Перейти к содержанию

awk для печати первого столбца

Первый столбец любого файла можно напечатать с помощью переменной $ 1 в awk. Но если значение первого столбца содержит несколько слов, то печатается только первое слово первого столбца. Используя специальный разделитель, можно правильно напечатать первый столбец. Создайте текстовый файл с именем student.txt со следующим содержанием. Здесь первый столбец содержит текст из двух слов.

Студенты.txt

Каниз Фатема 30thпартия
Abir Hossain 35thпартия
Иоанна Авраама 40thпартия

Запустить команду awk без разделителя. Будет напечатана первая часть первого столбца.

$awk '{печать $ 1}'student.txt

Запустите команду awk со следующим разделителем. Будет напечатана вся часть первого столбца.

$awk -F '\ SS' '{печать $ 1}'student.txt

Выход:

Перейти к содержанию

awk для печати последнего столбца

$ (NF) переменную можно использовать для печати последнего столбца любого файла. Следующие команды awk напечатают последнюю и полную часть последнего столбца таблицы. the student.txt файл.

$awk '{печать $ (NF)}'student.txt
$awk -F '\ SS' '{печать $ (NF)}'student.txt

Выход:

Перейти к содержанию

awk с grep

grep - еще одна полезная команда Linux для поиска содержимого в файле на основе любого регулярного выражения. Как команды awk и grep могут использоваться вместе, показано в следующем примере. рукоятка команда используется для поиска информации об идентификаторе сотрудника, ‘ 1002 ' из employee.txt файл. Вывод команды grep будет отправлен в awk в качестве входных данных. Бонус 5% будет подсчитан и распечатан на основе заработной платы сотрудника, удостоверяющего личность, ‘ 1002 ' командой awk.

$Котemployee.txt
$рукоятка '1002'employee.txt| awk -F ' т' '{print $ 2' получит $ '(3 $ * 5) / 100' бонус '}'

Выход:

Перейти к содержанию

awk с файлом BASH

Как и другие команды Linux, команда awk также может использоваться в сценарии BASH. Создайте текстовый файл с именем customers.txt со следующим содержанием. Каждая строка этого файла содержит информацию о четырех полях. Это идентификатор клиента, имя, адрес и номер мобильного телефона, разделенные знаком ‘/ '.

customers.txt

AL4934 / Charles M Brunner / 4838 Beeghley Street, Хантсвилл, Алабама / 256-671-7942
CA5455 / Virginia S Mota / 930 Bassel Street, VALLECITO, California / 415-679-5908
IL4855 / Ann A Neale / 1932 Patterson Fork Road, Чикаго, Иллинойс / 773-550-5107

Создайте файл bash с именем item_search.bash со следующим сценарием. Согласно этому скрипту, значение состояния будет взято у пользователя и найдено в the customers.txt файл рукоятка и передается команде awk в качестве входных данных. Команда awk будет читать 2nd а также 4th поля каждой строки. Если входное значение совпадает с любым значением состояния customers.txt файл, затем он распечатает клиентский имя а также номер мобильного , в противном случае он напечатает сообщение Заказчик не найден .

item_search.bash

#! / bin / bash
выбросил 'Введите название штата:'
читатьштат
клиентызнак равно``рукоятка '$ состояние'customers.txt| awk -F '/' '{print' Имя клиента: '$ 2,',
Мобильный номер: '4 доллара США'.
``
если [ '$ клиентов' !знак равно'' ];тогда
выбросил $ клиентов
еще
выбросил «Заказчик не найден»
быть

Выполните следующие команды, чтобы показать результаты.

$Котcustomers.txt
$трепатьitem_search.bash

Выход:

Перейти к содержанию

awk с sed

Еще один полезный инструмент поиска в Linux - sed . Эта команда может использоваться как для поиска, так и для замены текста любого файла. В следующем примере показано использование команды awk с sed команда. Здесь команда sed будет искать всех сотрудников, имена которых начинаются с ' J ’И передается команде awk в качестве входных данных. awk напечатает сотрудника имя а также Я БЫ после форматирования.

$Котemployee.txt
$sed -n '/ J / p'employee.txt| awk -F ' т' '{printf'% s (% s) n ', $ 2, $ 1}'

Выход:

Перейти к содержанию

Заключение:

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