Многие из вас активно используют awk. Ниже я хочу немного рассказать о нем в примерах. Надеюсь эта заметка окажется вам полезной. Обещаю, будет интересно 😉
Небольшая справка:
AWK — интерпретируемый скриптовый C-подобный язык построчного разбора и обработки входного потока по заданным шаблонам (регулярным выражениям).
Название AWK складывается из инициалов разработчиков языка: Alfred V. Aho, Peter J. Weinberger и Brian W. Kernighan.
Примеры:
Получаем сортированный по количеству соединений список. Полезно для детектирования простых DDOS атак
> netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
Получаем список GID/UID
> awk -F: ‘{print $3,$4}’ /etc/passwd
Получаем GID/UID пользователя, с логином alex
> awk -F: ‘$1 ~ /^alex$/ {print $3,$4}’ /etc/passwd
Если нужен поиск по всей строке $1 ~ можно опустить
> awk -F: ‘/alex/ {print $3,$4}’ /etc/passwd
В качестве разделителя может быть подстрока, например
> awk -F «code:[0-9][0-9][0-9]» …
Кроме этого, в awk есть 2 предустановленные переменные: NR — Number of Record и NF — Number of Field.
> awk -F: ‘/home/ {print $3,$4,NR,NF}’ /etc/passwd
еще примеры
> cat prices.txt
ProductName:Brand1:Brand2:Brand3
monitor:100:200:300
keyboard:50:100:150
mouse:10:20:30> awk -F: ‘NR==1 {for(i=2; i < NF+1; i++){ if ($i~/Brand2/) { cn = i; break; }}} $1 ~/mouse/ { print $cn; exit; }’ prices.txt
продолжаем
> cat prices.awk
NR==1 {
for(i=2; i < NF; i++)
{ if ($i == c) { cn = i; break; }}} $1 == p { print $cn; exit; }
> awk -F: -f prices.awk -v p=»monitor» c=»Brand2″ prices.txt
и ещё
NR==1 {
for(i=2; i < NF; i++)
{ if ($i == c) { cn = i; break; }}} $1 == p { print $cn; exit; }
END {total = $cn*2
print total
}> awk -F: -f prices.awk -v p=»monitor» c=»Brand2″ prices.txt