2017-05-31 99 views
0

我試圖使用grep輸出多個文件的結果的行號。如何從多個文件grep該特定文件的結果的行號

實施例:

文件1的名稱是test1.zip;內部test1.zip,內容是

123 
234 

文件2的名稱是test2.zip;內test2.zip,內容是

456 
789 

現在,這只是一個簡化的情況。在實際的情況下,我有這樣的多個文件。

現在,我這樣做:

gunzip -c test* | grep -n 789 

結果是

4;789 

但我希望看到的是

2;789 

因爲789是第二線在它自己的文件中,test2.zip

我該如何做到這一點?

回答

1

Grep只能看到一連串的線條,無法知道文件何時結束以及新文件何時開始,因此它不知道每個文件的行編號。

相反管道gunzip輸出到grep的,您可以直接使用zgrep

$ zgrep -n 789 test* 
test2.gz:2:789 

如果沒有zgrep,則可以使用find-exec如下:

$ find -name 'test*' -exec bash -c 'gunzip -c "$1" | grep -n 789 ' _ {} \; 
2:789 

這會找到與test*匹配的所有文件,並在其上運行您的管道。將管道引入find -exec的方法是產生一個bash -c 'command' _ {}的子shell,然後將command中的文件名稱作爲$1

這確實給你你要的結果,但如果你也想的文件名,你可以有它印如果-exec出口成功:

$ find -name 'test*' -exec bash -c 'gunzip -c "$1" | grep -n 789 ' _ {} \; -print 
2:789 
./test2.gz 
+0

謝謝本傑明! –

相關問題