Как выполнить поиск для одной и той же строки, но нескольких файлов одновременно?

57

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

grep -E 'fatal|error|critical|failure|warning|' /path_to_file

Как использовать это и искать строки из нескольких файлов одновременно? Если это то, что должно быть написано в сценарии, может ли кто-нибудь предоставить простой сценарий для этого?

user53029
источник
2
grepможет принимать более одного аргумента файла.
jw013

Ответы:

61
grep -E 'fatal|error|critical|failure|warning|' *.log
JigarGandhi
источник
Как мне grepпропустить каталоги, но все равно рекурсивно проверять все файлы? grep -E 'text' **/*работает, но выдает сообщение об ошибке для каждого подкаталога (а затем правильно проверяет все файлы в них)
Jorn
4
@Jorn, на самом деле вы должны задать новый вопрос, но используйтеfind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard
20

Вы можете использовать что-то вроде этого:

find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'

Это позволит найти каждый файл с .logрасширением as и применить grepкоманду.

jherran
источник
Это было слишком просто :) На самом деле все мои файлы .log, так что "grep -E 'fatal | error | критический |
fail
1
Какое большое усилие понимания / адаптации user53029!
Жиль Квено
1
Зачем беспокоиться xargsи возможность серьезной поломки пробелов в именах файлов, когда вы можете просто использовать find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
Wildcard
16

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

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 
flickerfly
источник
2
Так просто, но искал это слишком долго: 0
Адам Хьюз
3

Если вам нужно выполнить поиск произвольного набора имен файлов, которые не могут быть получены с помощью регулярного выражения:

grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`

В чем преимущество вставки имен файлов одно за другим? Вы можете скомпилировать список имен файлов в текстовом файле, а затем вставить его.

Диего Пино
источник
1

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

Он также будет искать рекурсивно в файлах подкаталогов.

egrep -r "string1|string2" pathname
Правин Кумар Б.С.
источник
1
относительно egrep
Джефф Шаллер
0

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

Скачать скрипт поиска по журналу

Как это работает, довольно просто.

Сценарий 1: Мониторинг одной строки в одном файле журнала

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open' '.'  1 2 single_errCheck -ndshow

Сценарий 2. Мониторинг НЕСКОЛЬКИХ строк в одном файле журнала

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_errCheck -ndshow

Сценарий 3: Мониторинг одной / нескольких строк в нескольких файлах журнала

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_err_multi_logCheck -ndshow

Примечания:

_P_ означает ИЛИ - Он заменяет трубу "|" символ, потому что менее вероятно, что вам придется искать строку, содержащую "_P_". Если вы не хотите вводить «_P_», вы можете просто заменить _P_ на «|».

При использовании этого скрипта параметры, которые вы будете часто менять:

  1. Файл журнала или каталог журнала для мониторинга
  2. Возраст файла журнала должен быть установлен для того, чтобы его можно было контролировать .. я не отслеживаю и не обнаруживаю файл журнала, который имеет временную метку более 60 минут
  3. Строки (ы) / шаблон (ы), которые вы хотите наблюдать
  4. Тег - это второй, последний аргумент, который вы должны указать. Он записывает статистику о файлах журналов, которые вы отслеживаете в / var / tmp / logXray
  5. Опция журнала -ndshow - это параметр, который вы хотите использовать, если хотите вывести записи из найденных журналов, соответствующие указанным шаблонам. Если вы просто хотите увидеть общее количество найденных шаблонов, просто замените -ndshow на -ndfoundmul.

Используя '-ndfoundmul', вы получите вывод, похожий на:

[root@dgphxtest001]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 blahblahA -ndfoundmul
OK: [/var/log/messages][1]  /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

Решение проблемы оригинального плаката: сканирование нескольких строк в нескольких файлах журнала

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

ОС: это было проверено на Ubuntu и Red Hat

Нагиос Мониторинг
источник
0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

При этом в файлах с именем, начинающимся с «log_file?», Будет выполнен поиск «фатальной или ошибки, или критической, или ошибки, или предупреждения, или строки поиска ». и расширение 'lo ' * в пути / path / to / the / file / и присвоить строке поиска случайный цвет и номер строки печати, по которой она была найдена.

Обэйд
источник
Конечно, это рабочий ответ, но пользователь запросил поиск по шаблону, а вы ответили с помощью фиксированной строки поиска. Извините, но добавление вещей, которые не запрашивались, таких как нумерация строк и раскраска результатов, вряд ли сделает ответ более полезным. Но будут и другие вопросы, на которые, вероятно, ответят ваши grepнавыки, так что удачи в вашей карьере USE!
Загримсан
Заняв точку @zagrimsan, я добавил -E 'фатальная | ошибка | критическая | ошибка | предупреждение |' парам к этому.
Обэйд
И эй, он специально попросил несколько файлов, а не шаблон поиска. Пожалуйста, прочитайте вопрос снова.
Обэйд
Цитата из Q: «искать конкретные строки», и вопрос показывает шаблон поиска (содержащий несколько строк для поиска), который он использует. Вы правы в том, что название вопроса немного отличается от того, что он действительно просит. Кстати, -Eи -Fне может быть использован в то же время, они противоречат друг другу (опечатка?).
Загримсан
0

Ответ ДжигарГанди демонстрирует использование подстановочного знака звездочки. Их больше, и вы можете увидеть их здесь или бегом man 7 glob.

Одним из них, который я нашел полезным, является соответствие диапазона []. Так как система, над которой я работаю, создает последовательно пронумерованные файлы журнала, например product.log.1 product.log.2 ... product.log.200, удобно выполнять grep с помощью одной команды для 3 или 4 последовательных файлов, но не более. Так это

grep 'whatever' product.log.[5-7]

будет grep для всех файлов, заканчивающихся на product.log. 5, 6 или 7. Подстановочный знак не обязательно должен быть в конце, поэтому ответ flickerfly можно упростить до

grep -E 'fatal|error|critical|failure|warning' file[1,2].log

Также обратите внимание, что эти подстановочные знаки можно использовать и в других командах, например, в cp.

Стелиос Адамантидис
источник
0

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

См пример

grep -E 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Если вы добавляете s в grep, это подавляет ошибки, связанные с отсутствующими файлами.

grep -sE 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Я сам экспериментировал с этим для выполнения команд, которые работают в нескольких дистрибутивах, где он находится в одном файле по сравнению с другим из-за различий в ОС.

Почтовые логи

sudo grep -is bob@example.com /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

Архивные журналы почты, использующие 2> / dev / null для подавления пропущенных zgrep предупреждений .gz

sudo zgrep -is bob@example.com /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

Справка: есть ли способ сослаться на несколько файлов в каталоге без повторного ввода всего пути?

Майк
источник