列出基于每个文件的匹配固定字符串

时间:2013-01-29 00:10:58

标签: bash optimization grep

以下代码有效,但速度很慢:

#!/bin/bash
for f in *.xml; do
  for r in $(cat ../reports.txt); do
    grep -q "$r" $f

    if [ $? -eq 0 ]; then
      echo "$r,$f"
    fi
  done
done

这可以通过以下方式加速:

for f in *.xml; do
  grep -lif ../reports.txt $f
done

但是,这不会显示reports.txt中与文件($f)匹配的行。

如何显示每个文件中找到的reports.txt的匹配行以及reports.txt中有一个或多个匹配项的文件名?

例如,如果reports.txt包含:

aardvark
aardwolf
anteater

其中一个文件(例如story.txt)包含:

This is a story about an aardvark and an aardwolf.

然后我试图产生以下输出:

story.txt,aardvark
story.txt,aardwolf

如果有帮助,reports.txt中的行不是正则表达式:它们是纯文本字符串。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

看看这个,它是否符合您的要求?

kent$  head report.txt story.txt
==> report.txt <==
aardvark
aardwolf
anteater

==> story.txt <==
is a story about an aardvark and an aardwolf.

kent$  grep -Hof report.txt story.txt
story.txt:aardvark
story.txt:aardwolf

测试是用grep完成的:

kent$  grep --version|head -1
grep (GNU grep) 2.14