Как грепать логи
Перейти к содержимому

Как грепать логи

  • автор:

Как грепать по 2 параметрам(например по времени и коду ошибки)

Часто спрашивают вопрос в личку как загрепать логи по дате и коду ошибки.

Отслеживать

Aleshin Aleksey

задан 29 окт 2021 в 15:00

Aleshin Aleksey Aleshin Aleksey

1 2 2 бронзовых знака

Попробуйте использовать ack habr.com/ru/post/502734

29 окт 2021 в 16:58

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

30 окт 2021 в 9:07

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

$ grep "[45]00" logs/2020/01/apache_2020-01-10.txt logs/2020/01/apache_2020-01-15.txt | grep "12:33:" 

Поиск в 2 файлах 400 и 500 ошибки в нужное время. Если нужно вывести ошибки в другой файл то можно так. где «w» — проверит слово в точности, а не его вхождение.

$ grep -i -w "500" test.txt > bug/event/500.txt 

PS Если у вас есть варианты лучше напишите тоже.

Отслеживать

51.6k 199 199 золотых знаков 59 59 серебряных знаков 242 242 бронзовых знака

ответ дан 30 окт 2021 в 11:10

Aleshin Aleksey Aleshin Aleksey

Grep — Основы командной строки

Слово «грепать» входит в топ самых популярных терминов, используемых разработчиками. Оно происходит от одноименной консольной утилиты grep (сокращение от global regular expression print). Эта утилита выполняет поиск определенного текста по файлу или файлам.

В этом уроке мы научимся грепать и разберемся в особенностях этого процесса.

Для разработчиков «грепать» — то же самое, что гуглить для активных пользователей интернета. Как правило, грепают файлы с исходным кодом или логи во время отладки:

grep SYNOPSIS grep [OPTIONS] PATTERN [FILE. ] grep [OPTIONS] [-e PATTERN]. [-f FILE]. [FILE. ] 

Рассмотрим этот пример подробнее:

  • PATTERN — это то, что мы хотим найти. Это может быть конкретная строчка или определенный шаблон с регулярными выражениями
  • FILE — путь до файла, в котором нужно искать

Посмотрите на еще один пример:

# Поиск всех строк в файле .bashrc, в которых встречается слово aliases grep aliases .bashrc # enable color support of ls and also add handy aliases # some more ls aliases # ~/.bash_aliases, instead of adding them here directly. if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases 

В примере выше утилита grep нашла пять строк. Найденные строчки выводятся на экран в том же порядке, в котором они встречаются в исходном файле.

В некоторых ситуациях нам нужно увидеть не только саму строку, но и текст вокруг нее. Количество выводимых соседних строк регулируется тремя опциями:

  • Количество отображаемых строк до искомой строки — -B или —before-context
  • Количество отображаемых строк после искомой — -A или —after-context
  • Количество отображаемых строк до и после искомой строки — -C или —context

Изучим пример использования -C со значением 1 . Это значит, что для каждой найденной строки будет выведена одна строка выше и одна строка ниже:

grep -C 1 aliases .bashrc # enable color support of ls and also add handy aliases if [ -x /usr/bin/dircolors ]; then -- # some more ls aliases alias ll='ls -alF' -- # You may want to put all your additions into a separate file like # ~/.bash_aliases, instead of adding them here directly. # See /usr/share/doc/bash-doc/examples in the bash-doc package. if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi 

Иногда мы не знаем, в каком файле находится то, что мы ищем. При этом мы можем знать директорию, в которой лежит этот файл.

В такой ситуации нужно сделать два изменения:

  1. Добавить опцию -r — она указывает, что надо искать внутри директории. Обратите внимание, что поиск идет рекурсивно, то есть с включением всех поддиректорий
  2. Указать путь до директории, а не файла

Попробуем применить утилиту grep с опцией -r :

grep -r bashrc . ./.profile: # include .bashrc if it exists ./.profile: if [ -f "$HOME/.bashrc" ]; then ./.profile: . "$HOME/.bashrc" ./.bash_history:du -sh .bashrc ./.bash_history:stat .bashrc ./.bash_history:stat -h .bashrc ./.bash_history:file .bashrc ./.bash_history:stat .bashrc ./.bash_history:cat .bashrc ./.bashrc:# ~/.bashrc: executed by bash(1) for non-login shells. ./.bashrc:# this, if it's already enabled in /etc/bash.bashrc and /etc/profile ./.bashrc:# sources /etc/bash.bashrc). 

При таком поиске в выводе указывается файл, в котором была найдена строка. Если добавить опцию n , то дополнительно отобразится номер строки:

grep -rn bashrc . ./.profile:13: # include .bashrc if it exists ./.profile:14: if [ -f "$HOME/.bashrc" ]; then ./.profile:15: . "$HOME/.bashrc" ./.bash_history:56:du -sh .bashrc ./.bash_history:57:stat .bashrc ./.bash_history:58:stat -h .bashrc ./.bash_history:60:file .bashrc ./.bash_history:61:stat .bashrc ./.bash_history:63:cat .bashrc ./.bashrc:1:# ~/.bashrc: executed by bash(1) for non-login shells. ./.bashrc:109:# this, if it's already enabled in /etc/bash.bashrc and /etc/profile ./.bashrc:110:# sources /etc/bash.bashrc). 
Дополнительные материалы

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Как использовать команду grep в linux

grep это вполне возможно самая популярная из существующих команд в Unix/Linux. Многие бы с этим поспорили, но стоит начать использовать grep , эта команда будет присутствовать почти во всех ваших скриптах для консоли Linux. grep расшифровывается как ‘global regular expression printer‘. Иными словами grep выдрезает нужные вам строки из текстовых файлов которые содержат указаный пользователем текст.

grep может быть использован двумя путями — сам по себе или в комбинации с потоками.

Использование grep в чистом виде

$ grep ’12:00′ /home/david/backup/log.txt

Эта команда показывает как можно использовать grep для того чтобы получить строки из файла содержащие подстроку указаную в командной строке. Файл не обязательно должен оканчиваться на .txt. Показаная выше команда производит поиск подстроки 12.00 в файле /home/david/backup/log.txt и отображает все строки где эта подстрока встречается.

Эта комбинация может быть использована например для поиска бекапов которые происходили в 12:00.

$ grep -v ‘12.00’ /home/david/backup/log.txt

А вот эта команда (с использованием ключа -v) наоборот покажет только те строки где подстрока ’12:00′ не встречается.

$ grep -l ‘delay’ /code/*.c

Эта команда будет искать все файлы оканчивающиеся на .c и текст в найденых файлах соответствующий подстроке ‘delay’ и в конечном итоге выведет только имена файлов где эта подстрока встречается.

Эта команда уже более сложная и состоит из комбинации двух команд grep . Первая ищет строки которые начинаются со слова ‘bay’ а вторая строки которые заканчиваются на слово ‘watch’.

Использование grep вместе с потоками

$ ls -l | grep rwxrwxrwx

Вы наверно уже знаете что команда ls -l отображает подробный список файлов в директории. Часть grep rwxrwxrwx фильтрует результат полученый от ls -l и выводит только те директории у которых установлены соответствующие права доступа. В данном случае это открытый доступ на чтение, запись и поиск для всех пользователей и групп. Так что вместо того чтобы увидеть полный список файлов вы увидите только те файлы у которых установлены нужные вам права доступа.

Вывод от команды grep может также быть направлен потоком в другую команду, например как в следующем примере:

$ du | grep ‘mp3’ | more

Вы должны уже догадаться что делает указаная выше команда Если не догадались то все просто — она выводит постранично список mp3 файлов найденых в текущей директории. Все просто

$ grep ‘^#’ /home/david/script1 | more

Эта команда отобразит все строки в файле /home/david/script1 которые начинаются с символа ‘#’. Определение тип ‘^#’ означает что символ ‘#’ должен быть первым символом с троке.

$ grep -v ‘^[0-9]’ /home/david/backup/log.txt | more

Эта команда ищет строки содержащие в первом символе цифры от 0 до 9 а потом выводит только те строки которые не попали в результаты поиска. Как вы видите — был использован ключ ‘-v’ означающий реверсивный поиск.

Важно: Необходимо заключать искомые строки в одинарные кавычки как указано в двух предыдущих примерах для того чтобы интерпретатор командной строки мог воспринимать их корректно. Иначе интерпретатор может понять это как другую команду и результат выполнения будет непредсказуем.

Некоторые дополнительные ключи команды grep :

  • -v : Выводи реверсивные результаты. Вместо того чтобы вывести строки где искомое было найдено — выводи те строки где искомой подстроки нет.
  • -c : Отключает стандартный способ вывода результата и вместо этого отображает только число обозначающее количество найденых строк.
  • -i : Делает поиск регистронезависимым
  • -w : Ведет поиск по цельным словам. Например при обычном поиске строки ‘wood’ grep может найти слово ‘hollywood’. А если используется данный ключ то будут найдены только строки где есть слово ‘wood’.
  • -l : Выводит только имена файлов где была найдена строка.
  • -r : Производит поиск рекурсивно по всем поддиректориям.

Я надеюсь эта небольшая инструкция поможет вам разобраться с этой полезной командой.

Использование grep

В первом примере мы будем искать пользователя User в файле паролей Linux. Чтобы выполнить поиск текста grep в файле /etc/passwd введите следующую команду:

$ grep User /etc/passwd

В результате вы получите что-то вроде этого, если, конечно, существует такой пользователь:

User:x:1000:1000:User. /home/User:/bin/bash 

А теперь не будем учитывать регистр во время поиска. Тогда комбинации ABC, abc и Abc с точки зрения программы будут одинаковы:

$ grep -i "user" /etc/passwd

Вывести несколько строк¶

Например, мы хотим выбрать все ошибки из лог-файла, но знаем, что в следующей строчке после ошибки может содержаться полезная информация, тогда с помощью grep отобразим несколько строк. Ошибки будем искать в Xorg.log по шаблону «EE»:

$ grep -A4 "EE" /var/log/xorg.0.log

Выведет строку с вхождением и 4 строчки после неё:

$ grep -B4 "EE" /var/log/xorg.0.log

Выведет целевую строку и 4 строчки до неё:

$ grep -C2 "EE" /var/log/xorg.0.log

Выведет по две строки с верху и снизу от вхождения.

Регулярные выражения в grep

Регулярные выражения grep — очень мощный инструмент в разы расширяющий возможности поиска текста в файлах. Для активации этого режима используйте опцию -e. Рассмотрим несколько примеров:

Поиск вхождения в начале строки с помощью спецсимвола «^», например, выведем все сообщения за ноябрь:

$ grep "^Nov 10" messages.1 Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10 

Поиск в конце строки — спецсимвол «$»:

$ grep "terminating.$" messages Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating. Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating. 

Найдём все строки, которые содержат цифры:

$ grep "[0-9]" /var/log/Xorg.0.log

Рекурсивный поиск фрагмента в файлах.¶

$ grep -r "mydomain.com" /etc/apache2/

Кавычки позволяют искать полное соотвествие с заданным шаблоном. Пример:

$ grep -r "zendsite" /etc/apache2/ /etc/apache2/vhosts.d/zendsite_vhost.conf: ServerName zendsite.localhost /etc/apache2/vhosts.d/zendsite_vhost.conf: DocumentRoot /var/www/localhost/htdocs/zendsite /etc/apache2/vhosts.d/zendsite_vhost.conf:  

Здесь перед найденной строкой указано имя файла, в котором она была найдена. Добавление параметра -n добавляет к выводу номер строки в файле, где найден заданный шаблон поиска. Вывод имени файла легко отключить с помощью опции -h:

$ grep -h -r "zendsite" /etc/apache2/ ServerName zendsite.localhost DocumentRoot /var/www/localhost/htdocs/zendsite  

Это будет искать только те файлы, у которых есть.c или.h расширения:

$ grep --include=\*.c,h> -rnw '/path/to/somewhere/' -e "pattern" 

Это исключает поиск всех файлов, заканчивающихся расширением.o:

$ grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern" 

Для каталогов можно исключить конкретный каталог через параметр –exclude-dir. Например, это исключает dir1/, dir2/dir2 и все из них, соответствующие * .dst/:

$ grep --exclude-dir=dir1,dir2,*.dst> -rnw '/path/to/somewhere/' -e "pattern" 

Поиск слов в grep

Когда вы ищете строку abc, grep будет выводить также kbabc, abc123, aafrabc32 и тому подобные комбинации. Вы можете заставить утилиту искать по содержимому файлов в Linux только те строки, которые выключают искомые слова с помощью опции -w:

$ grep -w "abc" имя_файла

Поиск двух слов¶

Можно искать по содержимому файла не одно слово, а два сразу:

$ egrep -w 'word1|word2' /path/to/file

Количество вхождений строки¶

Утилита grep может сообщить, сколько раз определённая строка была найдена в каждом файле. Для этого используется опция -c (счетчик):

$ grep -c 'word' /path/to/file

Инвертированный поиск в grep¶

Команда grep Linux может быть использована для поиска строк в файле, которые не содержат указанное слово. Например, вывести только те строки, которые не содержат слово пар:

$ grep -v пар /path/to/file

Вывод имени файла¶

Вы можете указать grep выводить только имя файла, в котором было найдено заданное слово с помощью опции -l. Например, следующая команда выведет все имена файлов, при поиске по содержимому которых было обнаружено вхождение primary:

$ grep -l 'primary' *.c

Цветной вывод в grep

Также вы можете заставить программу выделять другим цветом вхождения в выводе:

$ grep --color root /etc/passwd

© Copyright 2020 Revision 10618177 .

Built with Sphinx using a theme provided by Read the Docs.
Read the Docs v: latest

Versions latest Downloads pdf html epub On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *