Awk-多行匹配,打印文件名和匹配
我有以下awk命令:Awk-多行匹配,打印文件名和匹配,awk,Awk,我有以下awk命令: awk -v RS=! -v ORS= '/abc/ && /def/ {print FILENAME;}' files 这将查找文件中的每个文件,并用“!”分隔文件中的每个记录,然后将记录与“abc”和“def”匹配。然后,上面的代码将打印文件名。如果删除{print FILENAME},如果匹配,它将打印整个记录 文件看起来像: abc1 bce bcd def ! abc2 bce def ! 我想打印出文件名和与“abc”匹配的行。例如: fil
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
file1
abc1
file2
abc2
abc3
我该怎么办
awk 'FNR==1{print FILENAME} /abc/' file1 file2
FNR
字段设置为1
读取新文件FNR==1
为真,在每个输入文件的第一行,要执行的操作是print FILENAME
,它将打印file1
和file2
/abc/
将匹配包含abc
的所有行,因为未指定任何操作,默认为打印整个记录($0
)。这类似于编写/abc/{print$0}
如果没有匹配的文件,是否要打印文件名?您是否需要在示例awk脚本的上下文中完成此操作(对该脚本的修改)?或者像@nu11p01n73R这样的答案可以接受吗?
awk 'FNR==1{fname=FILENAME"\n"} /abc/{printf "%s%s\n", (fname?fname:""), $0; fname=""}' files