grep [опции] шаблон [файл ...] grep [опции] [-e шаблон | -f файл] [файл ...]
# Извлечение IP адреса echo -e "3.123.32.24\nFirst\n567" | grep -Eo "([0-9]{0,3}\.){3}[0-9]{0,3}" # Извлечение IP адресов с ошибкой авторизации из auth.log cat /var/log/auth.log | grep Failed | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort --unique > ip.list # Убрать из вывода пустые и закоментированные строки cat /etc/telegraf/telegraf.conf | grep -Ev "^#|^ #|^$" # Список IP активных подключений ss -ntlua | grep "8086" | awk '{print $6}' | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort --unique
: Скриптом добавить эти адреса в блок
# Сначала создаем отдельную цепочку для этого и ставим ее в начало "входа" INPUT iptables -N BLACKLIST iptables -I INPUT -j BLACKLIST # Затем читаем из файла список адресов и добавляем правила readarray lst < /../ip.list for i in "${lst[@]}" do /sbin/iptables -A BLACKLIST -s $i -j DROP done
Общий синтаксис: «pattern {action}«, действием могут быть: exit, next, print, printf.
Регулярные выражения обрамляются слэшами »/regex pattern/ {action}«.
Преимущество перед sed в том что сразу экранируются некоторые символы, но к сожалению не все
Пропустил / а вот & b \ тоже не пропустил
# Просто замена, PRINT для вывода результата на консоль awk '{gsub(/<USER_NAME>/,"this_is_uname"); print }' file # Сохранить резы в тот же файл, чтобы сразу нет такого параметра awk '{gsub(/<USER_NAME>/,"this_is_uname"); print }' file > tmp && mv tmp file # Тоже самое только групповая замена awk '{\ gsub(/<DATABASE_USER_NAME>/,"this_is_uname"); \ gsub(/<DATABASE_USER_PASSWORD>/,"this_is_passwd"); \ gsub(/<APP_URL>/,"https://my-site"); \ print }' file > tmp && mv tmp file # Сохранить изменения в этом же файле !! Это уже другая утилита gawk -i inplace '{ gsub(/<APP_URL>/, "https://my-site") }; { print }' file
cat 'text' | awk {'print $1,$3'} # Задать разделитель cat 'text' | awk 'OFS="-" {print $1,$3}' # Вывод имени файла и кол-во строк awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt awk 'length $0 > 2' letters.txt awk 'BEGIN { print "HI" } { print $0 } END { print "BYE!" }' letters.txt awk 'BEGIN { printf "%-10s %s\n", "Col1", "Col2"; \ printf "%-10s %s\n", "----", "------" } \ { printf "%-10s %s\n", $1, $2 }' mail-data awk '/[aeiou]{5}/' /usr/share/dict/words
Группировка и сложение
US|A|1000|2000 US|B|1000|2000 US|C|1000|2000 UK|1|1000|2000 UK|1|1000|2000 UK|1|1000|2000 awk 'BEGIN { FS=OFS=SUBSEP="|"}{arr[$1,$2]+=$3+$4 }END {for (i in arr) print i,arr[i]}' myfile US|A|3000 US|B|3000 US|C|3000 UK|1|9000 # Вариации # Сложить кол-во указанное напротив значений awk 'BEGIN { FS=OFS} {arr[$1]+=$2 }END {for (i in arr) print i,arr[i]}' myfile | sort -rnk2 # Два столбца awk 'BEGIN { FS=OFS} {arr[$1]+=$2; arr2[$1]+=$3 }END {for (i in arr) print i,arr[i],arr2[i]}' myfile | sort -rnk2
Потоковый редактор текста. Можно использовать для поиска, вставки, замены и удаления фрагментов в файле или потоке вывода.
sed опции -e команды файл
Опции:
У утилиты есть два буфера, активный и дополнительный. Выполняется заданное условие для каждой строки.
Очередная строка попадает сначала в активный буфер, выполняются команды, выводится в поток вывода и буфер очищается, в доп буфере хранится предыдущая строка.
Каждой команде можно передать адрес строки, к которой ее применить (по умолчанию для всех):
Некоторые команды:
Можно передавать несколько команд, для этого нужно разделить их точкой с запятой или две опции -e.
Не прпускает символ амперсанд и оба слеша
# -i чтобы сохранить в тот же файл sed -i 's/<USER_NAME>/this_uname/g' file
# Вывод с пятой по десятую строки $ sed -n '5,10p' /file # Весь файл кроме строк с 1 по 20 $ sed '1,20d' /file # Замена во всех строках $ sed 's/root/loost/g' /file # Замена только в указанных строках $ sed '1,10 s/0/10/g' /file # Удаление последних символов $ sed -e "s/.$//" /file
Удалить все пробелы
$ echo "string" | sed -r 's/\s+//g'
Относится как к grep так и к awk.
Синтаксис в целом соответствует
10.1.192.62 - - [18/Aug/2020:01:08:50 +0000] "POST /zabbix/jsrpc.php?sid=/b59ea3cc3hryh446/&type=9&method=screen.get×tamp=1597712895283&mode=0&screenid=58&groupid=&hostid=10262&pageFile=screens.php&profileIdx=web.screens.filter&profileIdx2=58&screenitemid=9594&from=2020-08-14%2000%3A00%3A00&to=2020-08-14%2006%3A00%3A00 HTTP/1.1" 200 845 "Chrome/84.0.4147.125 Safari/537.36" 10.1.192.38 - - [18/Aug/2020:01:08:50 +0000] "POST /zabbix/jsrpc.php?sid=/m85486u/k7kkjklij/&type=9&method=screen.get×tamp=1597712895291&mode=0&screenid=58&groupid=&hostid=10262&pageFile=screens.php&profileIdx=web.screens.filter&profileIdx2=58&screenitemid=9595&from=2020-08-14%2000%3A00%3A00&to=2020-08-14%2006%3A00%3A00 HTTP/1.1" 200 848 "Chrome/84.0.4147.125 Safari/537.36" 10.1.192.38 - - [18/Aug/2020:01:08:50 +0000] "POST /zabbix/jsrpc.php?sid=/kjtg986u76klju89/&type=9&method=screen.get×tamp=1597712895338&mode=0&screenid=58&groupid=&hostid=10262&pageFile=screens.php&profileIdx=web.screens.filter&profileIdx2=58&screenitemid=9597&from=2020-08-14%2000%3A00%3A00&to=2020-08-14%2006%3A00%3A00 HTTP/1.1" 200 840 "Chrome/84.0.4147.125 Safari/537.36" 10.1.192.38 - - [18/Aug/2020:01:08:50 +0000] "POST /zabbix/jsrpc.php?sid=/90ghdkyj78jyyfui/&type=9&method=screen.get×tamp=1597712895349&mode=0&screenid=58&groupid=&hostid=10262&pageFile=screens.php&profileIdx=web.screens.filter&profileIdx2=58&screenitemid=9598&from=2020-08-14%2000%3A00%3A00&to=2020-08-14%2006%3A00%3A00 HTTP/1.1" 200 828 "Chrome/84.0.4147.125 Safari/537.36" 10.1.192.67 - - [18/Aug/2020:01:08:50 +0000] "POST /zabbix/jsrpc.php?sid=/htrifh6gb476fdhr/&type=9&method=screen.get×tamp=1597712895355&mode=0&screenid=58&groupid=&hostid=10262&pageFile=screens.php&profileIdx=web.screens.filter&profileIdx2=58&screenitemid=9599&from=2020-08-14%2000%3A00%3A00&to=2020-08-14%2006%3A00%3A00 HTTP/1.1" 200 873 "Chrome/84.0.4147.125 Safari/537.36"
# 1. Фильтруем строки c нужным IP # 2. Из этих строк вырезаем значение между "sid=/" и "&" # 3. Обрезаем последний символ, им будет слеш # 4. Сортируем cat log.txt | grep 10.1.192.38 | grep -Po 'sid=/\K[^&]*' | sed -e "s/.$//" | sort
# Вывод только имени пользователя, из записей в логе, в уникальном списке sudo cat /var/log/auth.log.1 | grep -oP 'USER=\K[^;]*' | sort -u # Список подключений из ss sudo ss -ntlua | grep "8086" | awk '{print $6}' | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort --unique
Вывод файла, сортировка, подсчет вхождения, вывод таблицей
cat list.csv | sort | uniq -c | [column -t |] sort -r
Для записи в файл можно использовать перенаправление ввода ».
* -i (-I) - игнорировать регистр паттерна
Можно перенаправлять вывод, можно подавать файлы. Гуглятся целый ряд всяких параметров но что то нихрена толком не работает