Awk - 多行匹配,打印文件名和匹配

时间:2014-10-08 18:01:45

标签: awk

我有以下awk命令:

awk -v RS=! -v ORS= '/abc/ && /def/ {print FILENAME;}' files

查看文件中的每个文件,用文件分隔文件中的每个记录,然后将记录与' abc'并且' def'。然后,上面的代码将打印文件的名称。如果我删除{print FILENAME},它将打印整个记录(如果匹配)。

文件看起来像:

abc1
bce
bcd
def
!
abc2
bce
def
!

我想打印出文件名和匹配' abc'的行。例如:

file1
abc1

file2
abc2
abc3

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

awk 'FNR==1{print FILENAME} /abc/' file1 file2

FNR字段设置为1,读取新文件。 FNR==1为真,在每个输入文件的第一行,要执行的操作为print FILENAME,将打印file1file2

/abc/将匹配包含abc的所有行,因为未指定任何操作,默认为打印整个记录($0)。这与撰写/abc/{print $0}

类似
file1
abc1

file2
abc2
abc3

答案 1 :(得分:3)

awk 'FNR==1{fname=FILENAME"\n"} /abc/{printf "%s%s\n", (fname?fname:""), $0; fname=""}' files