2022-04-24 12:46:00
#ит_заметки #linux #bash #terminal #grep
Какой Linux админ не любит хорошенько грепнуть? Наравне с cat это, пожалуй, самая популярная консольная утилита, которую используешь постоянно. Буквально каждый день. Почти любой консольный вывод я грепаю, чтобы получить только нужную информацию.
Ниже несколько примеров не самых распространённых использований grep, но при этом полезных. Основной функционал, думаю, и так все знают.
Исключение из вывода части строки:
# echo 'raz_dva_tri' | grep -Po '\Kdva_tri'
dva_tri
Начало фразы raz_ вырезали. Здесь используются два ключа: P (perl-regexp) - использование регулярного выражение Perl, o (only-matching) - возвращает только совпадение с образцом. \K - регулярка, которая отбрасывает всё, что перед ней.
Проверка файла на наличие pattern.
# grep 'pattern' file > /dev/null && echo 'String Found'
# grep -q 'pattern' file && echo 'String Found'
Если pattern не будет найден в файле, конструкция && не сработает.
Посчитать количество совпадений pattern в файле:
# grep -c pattern file
Рекурсивный поиск файлов, где найден шаблон:
# grep -lr 'pattern' /web/site.ru
И обратная история, когда нужно вывести файлы, которые не содержат шаблон:
# grep -Lr 'pattern' /web/site.ru
Опять рекурсивный поиск по директории, только выводим не имена файлов, а все совпадающие строки:
# grep -hr 'pattern' /var/log
Бывает нужно когда какой-то ip пробиваешь по нескольким логам.
Когда через grep нужно вывести символы регулярных выражений, их нужно экранировать \ или использовать ключ F (fixed-strings):
# cat /var/log/syslog | grep 'systemd\[1]'
# cat /var/log/syslog | grep -F 'systemd[1]'
Да, я знаю, что не надо тут использовать cat, но я привык. Правильнее сделать так:
# grep -F 'systemd[1]' /var/log/syslog
Ничего не могу с собой поделать. Использую всегда с cat. Причина проста - не всегда нужен grep, а смотреть что-то в консоли я привык через cat. Так что мне проще сначала сделать просто cat, а потом грепнуть вывод в случае необходимости.
Ещё одна полезная опция grep - i (ignore-case) игнорировать регистр шаблона. Будут найдены и заглавные, и строчные совпадения.
# grep -i 'Page.html' /web/site
Вывести рядом с найденной строкой 2 до и 2 после:
# last | grep -A2 -B2 'reboot'
411 views09:46