====== AWK ====== AWK — интерпретируемый скриптовый C-подобный язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам. Работает в bash (SH) скриптах. Попробуем разобраться с AWK на примерах: Синтаксис awk gawk [ключи] [программа] [ список файлов] -F fs - разделитель полей -f файл программы Создадим список с которым будем работать и назовем его cars.txt. ''plym fury 1970 73 2500\\ chevy malibu 1999 60 3000\\ ford mustang 1965 45 10000\\ volvo s80 1998 102 9850\\ ford thundbd 2003 15 10500\\ chevy maliby 2000 50 3500\\ bmw 325i 1985 115 450\\ honda accord 2001 30 6000\\ ford taurus 2004 10 17000\\ toyota rav4 2002 180 750\\ chevy impala 1985 85 1550\\ ford explor 2003 25 9500'' Начнем работу. вывод всего файла. gawk '{print}' cars Вывод отдельных столбцов gawk '{print $1, $2, $5}' cars.txt Использование шаблона gawk ' /chevy/ {print}' cars.txt Использование оператора соответствия gawk '$1 ~ /h/' cars.txt gawk '$1 ~ /^h/' cars.txt gawk '$2 ~ /^[tm]/' cars.txt gawk '$3 ~/5$/ {print $3, $1, "$" $5}' cars.txt Сравнение текстовое gawk '"2000" <=$5 && "9000" > $5' cars.txt числовое gawk '2000 <=$5 && 9000 > $5' cars.txt Оператор диаразона gawk '/volvo/,/bmw/' cars.txt Работа с файлами программы: Создадим файл header '' BEGIN{ print " Производ. Модель. Год. Пробег. Цена" }\\ {print} '' gawk -f header cars.txt Модифицируем файл header '' BEGIN{ print " Производ. Модель. Год. Пробег. Цена"\\ print "-------------------------------------"\\ }\\ \\ /volvo/,/bmw/ {print}\\ END {\\ print "--------------------------------------"\\ }'' Проверим gawk -f header cars.txt Использование ИЛИ '' BEGIN{ print " Производ. Модель. Год. Пробег. Цена"\\ print "-------------------------------------"\\ }\\ \\ /volvo/ || /bmw/ {print}\\ END {\\ print "--------------------------------------"\\ \\ } '' Функция length gawk ' {print length, $0}' cars.txt Нумерациия строк gawk ' {print NR, $0}' cars.txt Разделители полей Разбор файла /etc/passwd BEGIN{ print "Пользователь \tДомашний каталог \t Интерпритатор", FS=":" print "---------------------------------------------------" } $3>=1000 {print $1 "\t\t" $6 "\t\t" $7} END {print "---------------------------------------------------"} SED sed (от англ. Stream EDitor) — потоковый текстовый редактор (а также язык программирования), применяющий различные предопределённые текстовые преобразования к последовательному потоку текстовых данных. Инструкции sed a - append - добавить с- change - изменить d - delete - удалить i - insert - вставить n - next - следующаяя строка со следующей инструкцией p - print - вывести q - quit - завершить r(файл) - добавление содержимого файла к выбранной строке s - substitute - подставить. флаги g - global - глобальный режим (все значения) p - print - вывести измененные строки w - write - записывать в файл. Примеры Задвоение выбранных строк sed '/ford/ p' cars.txt вывод только измененных строк sed -n '/ford/ p' cars.txt вывод по номерам строк sed -n '5,6 p' cars.txt Вывод первых пяти строк sed '5 q' cars.txt Использование файла программы. Создадим файл print_56 c содержимым. 5,6 p sed -n -f print56 cars.txt Добавление текста к строкам sed '2 a\ +++++' cars.txt sed '2 i\ +++++' cars.txt Замена строк файл сhange_test '' 2,4 c \ \\ ++++++++++++++++++\ \\ ------------------\ \\ ******************. \\ '' sed -f сhange_test cars.txt подставка. файл subs_demo s/ford/FORD/ sed -f subs_demo cars.txt Запись измененных строк в файл subs_demo2 s/ford/FORD/w temp Запись диапазона строк в другой файл. файл write_demo 2,4 w temp2 запись всех строк кроме выбранных 2,4 !w temp2 Инструкция (n следующий.) файл next_demo 3 n p n для шаблона next_demo2 /ford/ n p Несколько действий файл action ''1,3 s/ford/FORD/ \\ 2,4 s/volvo/VOLVO \\ 3 d'' Добавление строк файл app_demo '' 2 a\ \\ +++++++++++\ \\ ----------- \\ 3 p '' Как получть из лога ftpd айпишники злодеев-брутфорсеров: cat p.log | grep failed |cut -f1 -d")" |cut -f2 -d"@" |sort| uniq cat p.log -- берем лог grep failed -- берем из лога строки содержащие слово failed cut -f1 -d")" -- режем все что после ")" cut -f2 -d"@" -- режем все что до "@", остаются айпишники sort| uniq -- избавляемся от повторов