2014-10-08 138 views
0

我有以下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 

我该怎么办?

+0

做类似的?你是否需要在你的示例awk脚本(对该脚本的修改)的上下文中完成此操作?或者像@ nu11p01n73R的答案是可以接受的? – 2014-10-08 19:13:05

回答

4
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 
2
awk 'FNR==1{fname=FILENAME"\n"} /abc/{printf "%s%s\n", (fname?fname:""), $0; fname=""}' files 
相关问题