当我使用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
所发生的返回文件列表?
答案 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