Grep 目录中的所有文件并打印与文件名匹配的文件

Grep 目录中的所有文件并打印与文件名匹配的文件

我有一个日志文件列表,是我编写的视频编码脚本的一部分创建的。

我想搜索所有这些并从编码中打印出某些统计数据 - 它们的编码速度有多快,使用了哪些设置等等。

我可以通过以下一行代码搜索一个文件中的平均帧速率:

cat ${filename} | grep average

输出:

 work: average encoding speed for job is 23.211176 fps

并搜索 ratefactor:

cat ${filename} | grep RF

我想搜索目录中的所有文件并打印一条信息(最好是两条信息)以及文件名。我可以使用findgrep以一行代码实现这一点吗?还是我需要编写脚本?

我想要这样的输出:

/home/javanix/filename.log
    <RF line>
    <average line>

我希望它可以使用 FreeBSD 9 或 Ubuntu 12.04 来工作。

答案1

使用awk所需的输出格式:

awk '/average|RF/{ if(f!=FILENAME){f=FILENAME;print f} print"\t"$0}' *.log

对于递归搜索,

find path -name '*.log' -type f -exec \
  awk '/average|RF/{if(f!=FILENAME){f=FILENAME;print f}print"\t"$0}' {} \;

答案2

做这个:

egrep 'RF|average' *

输出结果与上面显示的结果不一致。输出结果如下:

filename1: ...
filename1: ...
filename2: ...
filename3: ...

有些文件名只会出现一次,有些则会出现多次,这取决于匹配的数量。

答案3

我想说你只能用 grep 来做到这一点:

grep -srHE 'average|RF' path/

s抑制错误,r进行递归,H显示文件名和E(和管道)以匹配任何两种模式。

答案4

尝试一下这个单行代码:

find -exec sh -c 'x=$(grep average "$0";grep RF "$0") && echo "$0\n$x"' {} \;

它将产生:

<file 1>
<RF line>
<average line>
[...]

如您所见,没有缩进来保持代码简短,另一种方法是在文件行上放置标记,例如:

[...] echo ">>> $0\n$x"' {} \;

相关内容