Як схопитися за один і той же рядок, але кілька файлів одночасно?


57

У мене є набір файлів журналів, які мені потрібно переглянути, і я хотів би одночасно шукати конкретні рядки в одних і тих же файлах. Чи можливо це? В даний час я використовую

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

Як це використовувати і шукати рядки декількох файлів одночасно? Якщо це щось, що потрібно сценаріювати, чи може хтось надати простий сценарій для цього?


2
grepможе приймати більше одного аргументу файлу.
jw013

Відповіді:


61
grep -E 'fatal|error|critical|failure|warning|' *.log

Як я можу 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розширенням та застосує grepкоманду.


Це було занадто просто :) Насправді всі мої файли є .log, так що "grep -E" фатальна | помилка | критична | помилка | попередження "* .log також працює. Дякую!
user53029

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 

2
Настільки просто, але шукали це занадто довго: 0
Адам Хьюз

3

Якщо вам потрібно отримати грейп на довільному наборі імен файлів, які неможливо отримати звичайним виразом:

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

Яка перевага перед вставкою файлів один за одним? Ви можете скласти список імен файлів у текстовому файлі та потім вставити його.


1

Якщо ви хочете рекурсивно шукати також у файлах підкаталогів, тоді ви можете скористатися командою нижче

Він також здійснюватиме рекурсивний пошук у файлах підкаталогів

egrep -r "string1|string2" pathname


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. Опція журналу - showhow - Це параметр, який ви бажаєте використовувати, якщо ви хочете вивести записи з знайдених журналів, що відповідають шаблону (им), який ви вказали. Якщо ви просто хочете побачити загальний підрахунок кожного знайденого шаблону, просто замініть '-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 ' * у шляху / шляху / до / файлу / та дайте рядку пошуку випадковий колір та номер рядка друку, у якому він був знайдений.


Звичайно, це відповідь справна, але користувач запитав пошук за шаблоном, ви відповіли за допомогою фіксованого рядка пошуку. Вибачте, але додавання речей, про які не вимагали, як-от нумерація рядків та забарвлення результатів, швидше за все, не зробить відповідь кориснішою. Але будуть інші питання, на які, можливо, можна відповісти вашим grepнавичкам, так що найкраще пощастить у вашій кар'єрі USE!
zagrimsan

@zagrimsan пункт прийнято, я додав -E "фатальна | помилка | критична | відмова | попередження |" парам до нього.
Обаїд

І ей, він спеціально просив декілька файлів, а не шаблон пошуку. Будь ласка, прочитайте питання ще раз.
Обаїд

Цитата з Q: "пошукові конкретні рядки", а питання показує шаблон пошуку (містить декілька рядків, для яких він відповідає), який він використовує. Ви маєте рацію, що заголовок питання трохи не відповідає тому, що він насправді задає. BTW, -Eі їх -Fодночасно не можна використовувати, вони суперечать один одному (помилка друку?).
zagrimsan

0

Відповідь ДжигарГандхі демонструє використання підстановки зірочок. Їх є більше, і ви можете їх побачити тут або бігом man 7 glob.

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

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

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

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 для придушення згрепу відсутніх .gz попереджень

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

Довідка: Чи існує спосіб посилатися на кілька файлів у каталозі без повторного введення цілого шляху?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.