我做了以下事情:
for i in ~/files/*; do cat $i | grep -e word1 -e word2; done
输出结果为:所有包含 word1 的值以及所有包含 word2 的文件。不仅仅是包含这两个文件。我还想要文件的名称,而不仅仅是值。
答案1
一般来说,您可以使用grep
的-H
选项“打印每个匹配的文件名”。
这将找到包含以下内容的行word1
或者 word2
:
grep -HE "word1|word2" ~/files/* 2>/dev/null
如果你想找到word1
和 word2
,而是这样做:
grep -HE "word1.*word2|word2.*word1" ~/files/* 2>/dev/null
将 stderr 发送到黑暗的遗忘之地可以2>/dev/null
防止grep
输出无用的错误消息,例如,如果其中一个匹配的文件是目录。
答案2
grep
通常打印匹配的行任何提供的模式。要打印与多个模式匹配的行,请将一个 grep 的输出通过管道传输到另一个 grep:
grep word1 | grep word2
对于许多文件:
grep word1 ~/files/* | grep word2
无需循环或cat
。
对于名称包含 的文件,此方法可能无法正常工作word2
。在这种情况下,请手动将模式组合成单个 grep:
grep -e 'word1.*word2' -e 'word2.*word1' ~/files/*
当向 提供多个文件时grep
,它默认打印文件名。要强制对单个文件名执行此操作,请使用-H
:
-H, --with-filename
Print the file name for each match. This is the default when
there is more than one file to search.
如果您收到有关参数列表太长的错误,并且目录不包含子目录,我仍然会告诉grep
您递归:
grep -R -e 'word1.*word2' -e 'word2.*word1' ~/files