我有一个日志文件列表,是我编写的视频编码脚本的一部分创建的。
我想搜索所有这些并从编码中打印出某些统计数据 - 它们的编码速度有多快,使用了哪些设置等等。
我可以通过以下一行代码搜索一个文件中的平均帧速率:
cat ${filename} | grep average
输出:
work: average encoding speed for job is 23.211176 fps
并搜索 ratefactor:
cat ${filename} | grep RF
我想搜索目录中的所有文件并打印一条信息(最好是两条信息)以及文件名。我可以使用find
或grep
以一行代码实现这一点吗?还是我需要编写脚本?
我想要这样的输出:
/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"' {} \;