【问题标题】:egrep add search pattern in resultegrep 在结果中添加搜索模式
【发布时间】:2021-06-27 03:30:11
【问题描述】:

我正在单个搜索中搜索多个单词,如下所示

egrep -rin 'abc|bbc' folder

我想在结果中获得带有搜索关键字的输出,例如

abc:folder/1.txt:32:abc is here
bbc:folder/ss/2.txt:2:    bbc is here

【问题讨论】:

  • 至少 GNU(Linux+) 和 FreeBSD(Mac) 版本的grep 具有--color(或--colour),如果您使用不同的颜色突出显示与正则表达式匹配的行部分终端/模拟器支持它——今天几乎所有人都支持它,尽管早在 70 年代和 80 年代人们使用各种各样的真实/硬件终端时,很多人都没有。注意对于完全不相交的字符串而不是-E 'foo|bar',您可以使用多个非扩展正则表达式-e foo -e bar
  • 您要搜索的正则表达式还是打印与正则表达式匹配的字符串?如果正则表达式在一行上匹配多次,输出应该是什么?当您说 multiple words 时,这是否意味着您实际上想要进行全字字符串比较,而不是示例中所示的部分行正则表达式比较?
  • edit 将您的问题包含在minimal reproducible example 中,其中包含简洁、可测试的样本输入和预期输出,以便我们为您提供帮助。不要只向我们展示微不足道的、阳光明媚的东西 - 向我们展示包含正则表达式元字符的搜索字符串、匹配输入中单独存在的“单词”以及作为其他单词的子字符串存在等。请参阅stackoverflow.com/questions/65621325/…有关如何针对此类问题提出和创建minimal reproducible example 的更多信息。

标签: grep


【解决方案1】:

这里有一些方法:

  1. 所有结果后的后处理:
grep -rinE 'abc|bbc' folder | sed '/abc/{s/^/abc:/; b}; s/^/bbc:/'

如果有很多搜索词:

$ for p in abc bbc; do echo "/$p/{s/^/$p:/; b};" ; done > script.sed
$ cat script.sed
/abc/{s/^/abc:/; b};
/bbc/{s/^/bbc:/; b};

$ grep -rinE 'abc|bbc' folder | sed -f script.sed

注意如果搜索词的内容可能与sed 元字符冲突,则需要注意此解决方案和下一个解决方案。

  1. 每个搜索词的后处理:
# add -F option for grep if search terms are fixed string
# quote search terms passed to the for loop if it can contain metacharacters
for p in abc bbc; do grep -rin "$p" folder | sed 's/^/'"$p"':/'; done
  1. find+gawk
$ cat script.awk
BEGIN {
    OFS = ":"
    a[1] = @/abc/
    a[2] = @/bbc/
}

{
    for (i = 1; i <= 2; i++) {
        if ($0 ~ a[i]) {
            print a[i], FILENAME, FNR, $0
        }
    }
}

$ find folder -type f -exec awk -f script.awk {} +
  • 如果您正在搜索固定字符串:
    • 将数组更改为a[1] = "abc"a[2] = "bbc"
    • 将条件更改为if (index($0, a[i]))

【讨论】:

  • 我在多个文件夹中进行批量搜索,循环添加搜索词会减慢搜索速度,搜索词将是动态的
  • @DyapaSrikanth 没有灵丹妙药,这是我能想到的。据我所知,grepripgrep 等替代工具中没有内置选项可以做到这一点。使用 ripgrep 获得更快的结果,因为它内置了并行处理。
  • 好的,我试试这个 ripgrep
猜你喜欢
  • 2013-10-18
  • 2015-05-16
  • 1970-01-01
  • 2014-08-03
  • 2021-11-28
  • 2017-12-13
  • 2019-02-03
  • 2017-10-30
  • 2021-01-22
相关资源
最近更新 更多