2014-03-06 58 views

回答

2

試試這個(下一文件是GNU擴展):

awk '$1=="ice" && $2=="cream"{print FILENAME;nextfile}' file1 file2 file3 

或者,如果你沒有GNU:

awk 'FNR==1{p=0} $1=="ice" && $2=="cream" && !p {print FILENAME;p=1}' file1 file2 file3 

FNR==1在每個文件的開始復位p標誌,然後當滿足條件時,p標誌被設置爲1,因此文件名只出現一次。

順便說一句,你可能更喜歡這種簡單:

grep -l "^ice.*cream" file* 

這是不完全相同,但很相似。

EDITED驗收

在這之後是可以更優雅的另一種可能性。它將匹配文件的名稱保存在數組names[]中,並在最後打印數組names[]的鍵。

awk '$1=="ice" && $2=="cream" {names[FILENAME]++} END{for(i in names)print i}' 
+1

'這裏exit'將這樣做,它只會打印第一個它與命中找到的文件名。如果他喜歡所有帶有「冰」和「奶油」的文件,它將會失敗。在grep中使用正則表達式,如果行在'ice'之前有'cream',將會失敗 – Jotne

+0

謝謝,是的。 –

+0

帶有'END'部分的第二個版本只打印最後一個文件,如果命中在多個文件中。 – Jotne

0

awk應該做

awk '$1 == "ice" && $2 == "cream" {print FILENAME}' * 

要得到行號和行信息,您可以使用:

awk '$1 == "ice" && $2 == "cream" {print NR,$0,"->",FILENAME}' * 

另一個版本:

awk '/^ice cream/ {print NR,$0,"->",FILENAME}' *