在 grep -f 中,我可以打印导致匹配的模式而不是匹配的模式吗?

在 grep -f 中,我可以打印导致匹配的模式而不是匹配的模式吗?

在命令中grep -f input_pat.txt match_in.txt,我正在寻找一种方法来打印匹配的模式input_pat.txt而不是最终匹配的字符串matched_in.txt

例如,input_pat.txt包含:

abc...blahblah

match_in.txt有:

abcdefblahblah

我想"abc...blahblah"在输出中打印。

答案1

可以通过调用 grep 两次来完成 - 成本有点高,但可以完成工作 让我们假设您的模式文件是 pat.txt,而您希望搜索的文件是 data.txt。

paste <(grep -o -f pat.txt  data.txt ) <(grep -f pat.txt data.txt )

我们使用进程替换<( ... ),以便paste将两个命令的两个输出视为文件。在第一个命令中,-o选项仅打印匹配的模式。在第二个命令中,打印完整的匹配行。

由于顺序是一对一的,因此可以安全地并排粘贴两个输出(假设执行 grep 时模式文件或数据文件没有更改)

答案2

如果切换到扩展正则表达式(如 的那些grep -E)是可以接受的,您可以使用awk相反的方法并执行以下操作:

awk '
  !end_of_re_list {if (!(re[$0]++)) n++; next}
  {
    for (i in re)
      if ($0 ~ i) {
        print i
        delete re[i]
        if (--n == 0) exit
      }
  }' input_pat.txt end_of_re_list=1 match_in.txt

相关内容