我有以下 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
我该怎么做?
最佳答案
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
关于Awk - 多行匹配、打印文件名和匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26263450/