題 Grep目錄中的所有文件並使用filename打印匹配項


我有一個日誌文件列表,我作為我編寫的視頻編碼腳本的一部分創建。

我想搜索所有這些並打印出編碼的某些統計信息 - 編碼速度,使用的設置等等。

我可以通過這個1個班輪在一個文件中搜索平均幀率:

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。


3
2018-06-25 15:15


起源


無用的貓獎! grep something somewhere 足夠。 - slhck
哈哈,夠公平的。我想要一個更好的解決方案,因此問題:) - javanix


答案:


運用 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
2018-06-25 15:40





做這個:

egrep 'RF|average' *

輸出與上面顯示的輸出不匹配。它會是這樣的:

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

有些文件名只會出現一次,有些文件名會出現,具體取決於有多少匹配。


3
2018-06-25 15:20





我會說你只能用grep這樣做:

grep -srHE 'average|RF' path/

s 壓制錯誤, r 對於遞歸, H 顯示文件名和 E (和管道)匹配 任何 兩種模式。


3
2018-06-25 15:23



太棒了,完美無缺。謝謝! - javanix
歡迎你,使用awk查看答案,因為你可以使用它更好地進行格式化,即使語法起初非常模糊。 - Shadok
我唯一不喜歡這個(雖然它似乎對我的使用最快)是它還輸出無法讀取的文件的錯誤,以及在命令期間似乎不存在的文件。雖然+1 - Canadian Luke
我剛剛更新了我的帖子 s 國旗:) - Shadok
確認:適合我 - Canadian Luke


試試這個命令:

grep -P "average|RF" *

grep 將搜索目錄中的所有文件(*)並顯示使用的所有匹配 Perl兼容的正則表達式 (PCRE) average|RF,兩者都匹配 average 和 RF

輸出格式如下:

filename.log:<RF line>
filename.log:<average line>

0
2018-06-25 15:21





試試這個單行:

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"' {} \;

0
2018-06-25 16:26