【问题标题】:Awk - Multiline matching, printing filename and matchawk - 多行匹配,打印文件名和匹配
【发布时间】:2014-12-03 12:00:03
【问题描述】:

我有以下 awk 命令:

awk -v RS=! -v ORS= '/abc/ && /def/ {print FILENAME;}' files

这会在 files 中查找每个文件,用“!”分隔文件中的每个记录,然后将记录与“abc”和“def”匹配。然后上面的代码将打印文件的名称。如果我删除{print FILENAME},它将打印整个记录(如果匹配)。

文件看起来像:

abc1
bce
bcd
def
!
abc2
bce
def
!

我想打印出文件名和匹配 'abc' 的行。例如:

file1
abc1

file2
abc2
abc3

我该怎么办?

【问题讨论】:

  • 如果没有匹配的文件,是否要打印文件名?您是否需要在示例 awk 脚本的上下文中完成此操作(修改该脚本)?或者像@nu11p01n73R 的回答可以接受吗?

标签: awk


【解决方案1】:
awk 'FNR==1{fname=FILENAME"\n"} /abc/{printf "%s%s\n", (fname?fname:""), $0; fname=""}' files

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多