Главная > Программы Использование awk в LinuxТекст это сердце Unix. Философия "все есть файл" полностью пронизывает всю систему и разработанные для нее инструменты. Вот почему работа с текстом является одним из обязательных навыков системного администратора или начинающего пользователя Linux. AWK - один из самых мощных инструментов для обработки и фильтрации текста, доступный даже для людей никак не связных с программированием. Использование awk в LinuxПростейшая и часто востребованная задача - выборка полей из стандартного вывода. Вы не найдете более подходящего инструмента для решения этой задачи, чем awk. По умолчанию awk разделяет поля пробелами. Если вы хотите напечатать первое поле, вам нужно просто указать awk параметр $1: # echo 'one two three four' | awk '{print $1}' one Да, использование фигурных скобок немного непривычно, но это только в первое время. Вы уже догадались как напечатать второе, третье, четвертое, или другие поля? Правильно это $2, $3, $4 соответственно. # echo 'one two three four' | awk '{print $3}' three Иногда необходимо представить данные в определенном формате, например, выбрать несколько слов. AWK легко справляется с группировкой нескольких полей и даже позволяет включать статические данные: # echo 'one two three four' | awk '{print $3,$1}' three one # echo 'one two three four' | awk '{print "foo:",$3,"| bar:",$1}' foo: three | bar: one Если поля разделены не пробелами, а другим разделителем, просто укажите в параметре -F нужный разделитель в ковычках, например ":" : # echo 'one mississippi:two mississippi:three mississippi:four mississippi' | awk -F":" '{print $4}' four mississippi Но разделитель не обязательно заключать в ковычки. Следующий вывод аналогичен предыдущему: # echo 'one mississippi:two mississippi:three mississippi:four mississippi' | awk -F: '{print $4}' four mississippi Иногда нужно обработать данные с неизвестным количеством полей. Если вам нужно выбрать последнее поле можно воспользоваться переменной $NF. Вот так вы можете вывести последнее поле: # echo 'one two three four' | awk '{print $NF}' four Также вы можете использовать переменную $NF для получения предпоследнего поля: # echo 'one two three four' | awk '{print $(NF-1)}' three Или поля с середины: # echo 'one two three four' | awk '{print $((NF/2)+1)}' three # echo 'one two three four five' | awk '{print $((NF/2)+1)}' three Все это можно сделать с помощью таких утилит как sed, cut и grep но это будет намного сложнее. И еще одна возможность awk, поддержка обработчиков для строк: # echo -e 'one 1\n two 2' | awk '{print $1}' one two # echo -e 'one 1\n two 2' | awk '{print $2}' 1 2 # echo -e 'one 1\n two 2' | awk '{sum+=$2} END {print sum}' 3 Это означает что мы должны выполнять следующий блок кода для каждой строки. Это можно использовать, например, для подсчета количества переданных данных по запросам из журнала веб-сервера. Представьте себе, у нас есть журнал доступа, который выглядит так: 23 июля 18:57:12 HTTPD [31950]: "GET / Foo / бар HTTP / 1.1" 200 344
23 июля 18:57:13 HTTPD [31950]: "GET / HTTP / 1.1" 200 9300
23 июля 19:01:27 HTTPD [31950]: "GET / HTTP / 1.1" 200 9300
23 июля 19:01:55 HTTPD [31950]: "GET / Foo / Baz HTTP / 1.1" 200 6401
23 июля 19:02:31 HTTPD [31950]: "? GET / Foo / Baz страница = 2 HTTP / 1.1" 200 6312
Нам известно что последнее поле это число переданных байт, тогда мы можем использовать переменную $NF: # < requests.log awk '{print $NF}' 344 9300 9300 6401 6312 Вот так можно подсчитать количество байт: # < requests.log awk '{totalBytes+=$NF} END {print totalBytes}' 31657 Это только несколько примеров показывающих использование awk в Linux , освоив awk один раз в получите очень мощный и полезный инструмент на всю жизнь. Материал взят с сайта:Главная > Программы |