Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk-多行匹配,打印文件名和匹配_Awk - Fatal编程技术网

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命令:

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