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 – избавляемся от повторов