2014-03-06 54 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}' *