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

时间:2011-01-10 18:19:35

标签: 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

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

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

out0134
-catch_rsh /opt/gridengine/default/spool/compute-0-17/active_jobs/327708.1/pe_hostfile
compute-0-17

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

我如何grep返回文件的内容,而不是grep error *log | grep foo所发生的返回文件列表?

4 个答案:

答案 0 :(得分:8)

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

grep -l foo $(grep -l error *.log)

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

grep -l error *.log | xargs grep -l foo

执行相同的操作,使用xargs以第一个grep的结果作为参数调用第二个grep。

答案 1 :(得分:6)

  

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

grep -a "some error message" *.log

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

  

如果是文件的前几个字节   表示该文件包含二进制文件   数据,假设文件是​​类型   类型。默认情况下,TYPE是                 二进制...

更新

如果您只想在包含错误的行中包含单词 foo 的文件名列表,那么您可以执行以下一项或另一项:< / p>

grep -la "error.*foo" *.log&lt; - 假设 foo 出现错误

答案 2 :(得分:2)

我这样做。

  

$ find。 -type f -name * .log | fgrep -v   [任何不需要的东西] | xargs grep -i   [在文件内搜索]

答案 3 :(得分:0)

评论询问如何只在匹配错误的文件中grep foo,你可以:

for i in *log ; do
    grep -a error $i >/dev/null 2>&1 && {
        echo -e "File $i:\n\t"
        grep -a foo $i
    }
done