我有以下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
我该如何解决这个问题?
答案 0 :(得分:5)
awk 'FNR==1{print FILENAME} /abc/' file1 file2
FNR
字段设置为1
,读取新文件。 FNR==1
为真,在每个输入文件的第一行,要执行的操作为print FILENAME
,将打印file1
和file2
/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