我正在编写一个shell脚本来查找包含字符串" match1"的文件。 AND不包含" match2"。
我可以分为两部分来完成:
有没有办法在不经过创建临时文件的过程中直接实现这一目标?
答案 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"