Инструменты пользователя

Инструменты сайта


linux:overall:views

Фильтрация вывода

grep

grep [опции] шаблон [файл ...]
grep [опции] [-e шаблон | -f файл] [файл ...]
  • grep 'ключевое слово' - поиск заданного слова/строки.
  • -B (-A) - кол-во строк до (после) вхождения.
  • -E (-e) - использование рег выражения (образец)
  • -P [–perl-regexp] - рег. выражение Perl
  • -o - вывод только части строки, подходящей под указанный шаблон
  • -с [–count] - кол-во строк совпадающего (не совпадающего) результата
  • -D (-d) - действие, применимо к уст-вам или каталогам, можно читать как обычные файлы, в т.ч. рекурсивно
  • -f [–file] - шаблон из файла, по одному в каждой строке
  • -v [–invert-match] - изменить смысл совпадения, выбор не совпадающих строк
  • -w [–word-regexp] (-x [–line-regexp]) - совпадение только всего слова (всей строки)
:!: Примеры
  # Извлечение 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

awk

Общий синтаксис: «pattern {action}«, действием могут быть: exit, next, print, printf.
Регулярные выражения обрамляются слэшами »/regex pattern/ {action}«.

  • $№ - указывает номер поля для вывода, разделяются пробелами.
    • $0 - вся строка
    • $NF - последнее поле с его номером
  • -OFS - задать разделитель в выводе
  • BEGIN/END - имеют собственный набор д-й, выполняются один раз
  • -F - указать разделитель во входных данных, вместо пробела
  • substr (s, a, b) - подстрока строка-s, кол-во- b, начать с- a. Используется внутри 'print'
  • Встроенные переменные:
  • NF - Количество полей в записи
  • NR - Номер текущей записи
  • FILENAME - Имя входного файла, который в данный момент обрабатывается
  • FS - Разделитель полей
  • RS - Разделитель записей
  • OFS - Разделитель выходных полей
  • ORS - Разделитель выходной записи
:!: Поиск и замена

Преимущество перед 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

Потоковый редактор текста. Можно использовать для поиска, вставки, замены и удаления фрагментов в файле или потоке вывода.

sed опции -e команды файл

Опции:

  • -n - не выводить содержимое буфера шаблона в конце каждой итерации
  • -f - прочитать команды редактирования из файла
  • -i - сделать резервную копию файла
  • -r - поддержка расширенного синтаксиса рег выражений
  • -s - несколько файлов рассматривать как отдельные потоки, а не один сплошной

У утилиты есть два буфера, активный и дополнительный. Выполняется заданное условие для каждой строки.
Очередная строка попадает сначала в активный буфер, выполняются команды, выводится в поток вывода и буфер очищается, в доп буфере хранится предыдущая строка.

Каждой команде можно передать адрес строки, к которой ее применить (по умолчанию для всех):

  • номер - номер строки
  • первая ~шаг (~число) - с первой, далее с указанным шагом (номер строки кратный указанному числу)
  • $ - последняя строка
  • /рег. выражение/ - подходящая под рег выражение
  • номер, номер - с номера до номера
  • номер, /рег. выражение/ - с номера до рег выражения
  • номер, +кол-во - с номера до кол-ва

Некоторые команды:

  • q - завершает работу сценария
  • d - удаляет буфер и запускает следующую итерацию
  • p (n) - вывод содержимого буфера шаблона (причитать в него след строку)
  • s/что_заменять/на_что_заменять/опции - замена символов, поддержка рег выражений
  • y/символы/символы - замена символов
  • w - записать содержимое буфера в шаблона в файл
  • i - сохранять изменения в файл

Можно передавать несколько команд, для этого нужно разделить их точкой с запятой или две опции -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'

RegEx

Относится как к grep так и к awk.

  • \ - экранирование
  • ^($) - начало (конец) строки
  • . - любой одиночный символ
  • [] - перечень/диапазон символов, можно несколько диапазонов, что бы исключить символ поставьте перед ним \
    • например: [A-Za-z0-9\F]
  • * - любое кол-во вхождения пред выражения
  • ? - одно либо не одного вхождения пред выражения
  • + - как минимум одно вхождение пред выражения
  • {n} {n,} {,m} {n,m} - повторы вхождения пред выражения
  • | - оператор ИЛИ

RegEx (Perl)

Синтаксис в целом соответствует

  • ^ ($) - Начало (конец) строки
  • . (*) - любой одиночный символ (ноль или более вхождений пред выражения)
  • […] ([^…]) - любой одиночный символ в скобках (не указанный в скобках)
  • + (?) - 1 одно или несколько вхождений (0 или 1 вхождение)
  • {n}, {n,}, {n,m} - ровно n, n или несколько вхождений, ровно от n до m
  • a | b - «либо»
  • i - не учитывать регистр
  • \K - задает условное начало строки от найденного фрагмента

Примеры. Разное

:!: Пример: over
Источник для фильтрации
10.1.192.62 - - [18/Aug/2020:01:08:50 +0000] "POST /zabbix/jsrpc.php?sid=/b59ea3cc3hryh446/&type=9&method=screen.get&timestamp=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&timestamp=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&timestamp=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&timestamp=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&timestamp=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
:!: OverAll
# Вывод только имени пользователя, из записей в логе, в уникальном списке
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

Просмотр файлов

  • cat - содержимое файла в поток вывода
  • tail - заданное кол-во строк с конца файла + интерактивное обновление
  • head - заданное кол-во строк с начала файла
  • less - постраничный просмотр
  • column - вывод в табличном виде
cat

Для записи в файл можно использовать перенаправление ввода ».

  • -n (-b) - нумеровать строки (только не пустые).
  • -s - удалять пустые строки.
  • -E - показывать символ $ в конце каждой строки.
  • -T - отображать символ табуляции.
tail
  • -f [–pid] - авто-обновление [закрыться с процессом].
  • -s сек - частота обновления.
  • -n - кол-во строк (10 по умолчанию).
head
  • -n - кол-во строк (10 по умолчанию).
  • –lines=[-]NUM - весь текст, кроме последних NUM строк.
  • -z - символ новой строки.
less

* -i (-I) - игнорировать регистр паттерна

  • -n (-N) - не выводить (выводить) номера строк
column

Можно перенаправлять вывод, можно подавать файлы. Гуглятся целый ряд всяких параметров но что то нихрена толком не работает

  • -t - для табличной формы
  • -s «symb» - символ для разделения
uniq

https://losst.pro/komanda-uniq-linux

linux/overall/views.txt · Последнее изменение: 2024/02/10 14:58 — admin