如何grep表示相同的字符串,但同时有多个文件?


57

我有一组日志文件需要查看,我想一次在同一文件上搜索特定的字符串是否可以?目前我正在使用

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

如何使用此功能并一次搜索多个文件的字符串?如果这需要编写脚本,那么有人可以提供简单的脚本来执行此操作吗?


2
grep可以接受多个文件参数。
jw013 2014年

Answers:


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' {} +
通配符

20

您可以使用如下形式:

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

这将找到每个带有.log扩展名的文件并应用grep命令。


太容易了:)实际上我的所有文件都是.log,所以“ grep -E'致命|错误|严重|失败|警告'* .log也可以工作。谢谢!
2014年

1
理解/适应user53029真是费劲!
Gilles Quenot 2014年

1
当您可以使用时,为什么要打扰文件名中的空格xargs并可能严重破坏文件名find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
通配符

16

如果更简单,则可以一个接一个地指定每个文件。

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 

2
如此简单,但一直在寻找它太长的时间:0
Adam Hughes

3

如果需要对一组不能由正则表达式检索的文件名进行grep:

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

相继粘贴文件名有什么好处?您可以在文本文件上编译文件名列表,然后将其粘贴。



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?”开头的文件中搜索“致命或错误,严重,失败或警告或搜索字符串”。在路径/ path / to / the / file /中使用扩展名'lo '*,并为搜索字符串提供一个随机的颜色和在其上找到的打印行号。


当然这是一个可行的答案,但是用户要求使用模式进行搜索,而您使用固定的搜索字符串进行了回答。抱歉,但是添加未要求的内容(如行号和结果的颜色)不太可能使答案更加有益。但是,还有其他一些问题可能会回答您的grep技能,以便您在USE职业生涯中取得好运!
zagrimsan

@zagrimsan点,我添加了-E'致命|错误|严重|失败|警告|' 它的参数。
Obaid

嘿,他特别要求提供多个文件,而不是搜索模式。请再次阅读问题。
Obaid

引用Q:“搜索特定的字符串”,问题显示了他使用的搜索模式(包含多个要匹配的字符串)。没错,问题的标题与他的实际要求略有出入。顺便说一句,-E并且-F不能同时使用,它们是有冲突的(典型吗?)。
zagrimsan

0

JigarGandhi的答案演示了星号通配符的用法。它们更多,您可以在此处或通过运行看到它们man 7 glob

我发现有用的其中之一是与匹配的范围[]。由于我使用的系统会生成按顺序编号的日志文件,例如product.log.1 product.log.2 ... product.log.200,使用grep只需一个命令即可处理3或4个顺序文件,但不会更多。所以这

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

将对所有以product.log结尾的文件进行grep。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

参考: 有没有一种方法可以引用目录中的多个文件而无需重新键入整个路径?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.