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

Вероятно, существует скрытый символ после 4106, по всей вероятности возврат каретки, если бы файл прибывает из мира Microsoft, который необходимо было бы разделить сначала (или сделать все это с awk).

$ seq 1 $'2\r'
seq: invalid floating point argument: 2
Try `seq --help' for more information.
$ echo seq 1 $'2\r'
seq 1 2

Это там, но Вы не видите его. Когда произведено к терминалу, это (обычно) только перемещает курсор в начало строки.

С ksh93, zsh или ударом, попробуйте:

printf '<%q>\n' "$start"

видеть то, что это содержит.

60
04.12.2014, 03:32
7 ответов

Можно использовать нечто подобное:

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

В этом случае каждый файл с расширением .log будет найден и применена команда grep.

22
27.01.2020, 19:32
grep -E 'fatal|error|critical|failure|warning|' *.log
64
27.01.2020, 19:32

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

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

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

3
27.01.2020, 19:32

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

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 
17
27.01.2020, 19:32

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

Log Search Script Download

Принцип работы довольно прост.

Сценарий 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_ означает OR - он заменяет символ трубы "|", поскольку менее вероятно, что вам придется искать строку, содержащую "_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
27.01.2020, 19:32
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

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

0
27.01.2020, 19:32

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

См. пример

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

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

2
27.01.2020, 19:32

Теги

Похожие вопросы