Grep 如何从目录中的文件中搜索2个关键字,并在出现多次时打印其文件名

Grep 如何从目录中的文件中搜索2个关键字,并在出现多次时打印其文件名,grep,duplicates,find,Grep,Duplicates,Find,我试图grep或查找目录中每个文件中的2个特定单词。然后,如果我发现有多个文件使用这种组合,那么我应该将这些文件名打印到CSV文件中 以下是我迄今为止所做的尝试: find /dir/test -type f -printf "%f\n" | xargs grep -r -l -e 'ABCD1' -e 'ABCD2' > log1.csv 但这将提供所有具有“ABCD1”和“ABCD2”的文件名。换句话说,即使只有一个文件具有此组合,此命令也会打印文件名 我需要为这两个单词对整个目录进

我试图grep或查找目录中每个文件中的2个特定单词。然后,如果我发现有多个文件使用这种组合,那么我应该将这些文件名打印到CSV文件中

以下是我迄今为止所做的尝试:

find /dir/test -type f -printf "%f\n" | xargs grep -r -l -e 'ABCD1' -e 'ABCD2' > log1.csv
但这将提供所有具有“ABCD1”和“ABCD2”的文件名。换句话说,即使只有一个文件具有此组合,此命令也会打印文件名

我需要为这两个单词对整个目录进行grep,如果必须将文件名写入CSV,则这两个单词必须位于多个文件中。我还应该能够包括子目录

任何帮助都会很好


感谢

查找+GNUgrep解决方案:

find . -type f -exec grep -qPz 'ABCD1[\s\S]*ABCD2|ABCD2[\s\S]*ABCD1' {} \; -printf "%f\n" \
| tee /tmp/flist | [[ $(wc -l) -gt 1 ]] && cat /tmp/flist > log1.csv

替代方法:

grep -lr 'ABCD2' /dir/test/* | xargs grep -l 'ABCD1' | tee /tmp/flist \
| [[ $(wc -l) -gt 1 ]] && sed 's/.*\/\([^\/]*\)$/\1/' /tmp/flist > log1.csv

find+GNUgrep解决方案:

find . -type f -exec grep -qPz 'ABCD1[\s\S]*ABCD2|ABCD2[\s\S]*ABCD1' {} \; -printf "%f\n" \
| tee /tmp/flist | [[ $(wc -l) -gt 1 ]] && cat /tmp/flist > log1.csv

替代方法:

grep -lr 'ABCD2' /dir/test/* | xargs grep -l 'ABCD1' | tee /tmp/flist \
| [[ $(wc -l) -gt 1 ]] && sed 's/.*\/\([^\/]*\)$/\1/' /tmp/flist > log1.csv

所以,至少应该有2个文件名被打印到csv中?这是正确的。为什么标题说在目录中查找重复项?什么复制品?另外,如果它发现这两种模式或其中一种模式就足够了?你是对的,它确实不是重复的。我会相应地更改标题(如果允许的话)。我需要为这两个单词对整个目录进行grep,如果必须将文件名写入CSV,则这两个单词必须位于多个文件中。谢谢你的帮助!好的,请用您最后的评论更新您的问题。还有一个细微差别:在搜索过程中是否应该考虑子目录?因此,应该至少有2个文件名被打印到csv中?这是正确的。为什么标题说在目录中查找重复项?什么复制品?另外,如果它发现这两种模式或其中一种模式就足够了?你是对的,它确实不是重复的。我会相应地更改标题(如果允许的话)。我需要为这两个单词对整个目录进行grep,如果必须将文件名写入CSV,则这两个单词必须位于多个文件中。谢谢你的帮助!好的,请用您最后的评论更新您的问题。还有一个细微差别:在搜索过程中应该考虑子目录吗?谢谢-它说“grep:The-P和-z选项不能组合”。这可能与我的设置有关。但不确定@Fkhader,检查我的附加方法谢谢-它说“grep:The-P和-z选项不能组合”。这可能与我的设置有关。但不确定@Fkhader,检查我的附加方法