如何grep grep返回的文件内容?

Dav*_*uer 4 bash grep

当我查找带有错误消息的日志文件时grep error *log,它会返回一个日志文件列表

$grep error *log

Binary file out0080-2011.01.07-12.38.log matches
Binary file out0081-2011.01.07-12.38.log matches
Binary file out0082-2011.01.07-12.38.log matches
Binary file out0083-2011.01.07-12.38.log matches
Run Code Online (Sandbox Code Playgroud)

但是,这些是文本,而不是二进制文件.

我不确定为什么这些被认为是二进制,前几行包含以下非错误消息:

out0134
-catch_rsh /opt/gridengine/default/spool/compute-0-17/active_jobs/327708.1/pe_hostfile
compute-0-17
Run Code Online (Sandbox Code Playgroud)

我想grep 返回文件的内容以获取错误消息,并返回带有消息的文件的名称.

我如何grep返回的文件的内容,而不是这个返回的文件列表,如grep error *log | grep foo

Cas*_*bel 8

以下是您可能正在寻找的答案:

grep -l foo $(grep -l error *.log)
Run Code Online (Sandbox Code Playgroud)

-l告诉grep只打印文件名; 执行第一个grep,然后将结果替换为下一个grep命令.或者,如果你喜欢xargs:

grep -l error *.log | xargs grep -l foo
Run Code Online (Sandbox Code Playgroud)

它做了同样的事情,使用xargs以第一个grep的结果作为参数调用第二个grep.


Sie*_*geX 6

-a, -
text处理二进制文件,就好像它是文本一样; 这相当于--binary-files = text选项.

grep -a "some error message" *.log

顺便说一句,这是grep如何从文本文件中确定二进制文件

如果文件的前几个字节表明该文件包含二进制数据,则假定该文件的类型为TYPE.默认情况下,TYPE是二进制的......

更新

如果您只想要一个包含单词foo的文件名列表,该行也包含错误,那么您可以执行以下一个或另一个:

grep -la "error.*foo" *.log < - 假设foo错误之后出现