查找包含字符串match1但不包含match2的文件

时间:2016-01-28 19:27:47

标签: bash file shell grep

我正在编写一个shell脚本来查找包含字符串" match1"的文件。 AND不包含" match2"。

我可以分为两部分来完成:

  1. grep -lr" match1" *>的/ tmp / MATCH1
  2. grep -Lr" match2" *>的/ tmp / MATCH2
  3. comm -12 / tmp / match1 / tmp / match2
  4. 有没有办法在不经过创建临时文件的过程中直接实现这一目标?

5 个答案:

答案 0 :(得分:2)

我会和awk一起使用find。 awk可以在一次运行中检查两个匹配项,这意味着您不需要两次处理所有文件:

find -maxdepth 1 -type f -exec awk '/match1/{m1=1}/match2/{m2=1} END {if(m1 && !m2){print FILENAME}}' {} \;

在多行版本中有更好的解释:

# Set flag if match1 occurs
/match1/{m1=1}

# Set flag if match2 occurs
/match2/{m2=1}

# After all lines of the file have been processed print the
# filename if match1 has been found and match2 has not been found.
END {if(m1 && !m2){print FILENAME}}

答案 1 :(得分:2)

使用bash的process substitution

    one   two
0   3     Two roads
1   7     diverged in a yellow
2   8     wood and sorry I
3   9     could not travel both

答案 2 :(得分:2)

将GNU awk用于多字符RS:

awk -v RS='^$' '/match1/ && !/match2/ {print FILENAME}' *

答案 3 :(得分:1)

  

有没有办法在不经过创建临时文件的过程中直接实现这一目标?

是。您可以使用管道和xargs

grep -lr "match1" * | xargs grep -Lr "match2"

如您所知,第一个grep打印包含与其标准输出匹配的文件的名称。 xargs命令从其标准输入中读取这些文件名,并将它们转换为第二个grep命令的参数,并在已经提供的参数之后附加它们。

答案 4 :(得分:0)

您最初可以搜索包含match1的文件,然后使用xargs使用-L--files-without-match选项将其传递给其他grep。

grep -lr "match1" *|xargs grep -L "match2"