如何使用“find”和“grep”执行相当于“where”子句的操作

如何使用“find”和“grep”执行相当于“where”子句的操作

我有一个文本文件的文件夹树,我想查找子字符串的实例以及它们来自的文件的名称。

如果我做类似的事情:

find . | xargs cat | grep 'abc'

然后我会找到子字符串的实例,但不会找到它们最初来自的文件。

谢谢您的帮助!

答案1

像这样运行xargs cat会丢失文件名,并且没有好的方法可以在数据流经的同时将它们传递到管道。

grep -l列出了具有匹配字符串的文件名,因此您可以使用它:

find . -type f | xargs grep -l hello

或者只需递归地挖掘目录,也可以解决文件名包含空格或引号的grep -r问题:xargs

grep -lre abc .

如果您还想要匹配的字符串,而不仅仅是文件名,请删除-l以获得通常的grep行为。使用-r,即使我们只在命令行上给出一个路径,它也应该打印匹配的文件名。

答案2

xargs是多余的。当您这样做时xargs cat | grepgrep只会看到一个无名输入流,其中包含所有文件的串联内容。改为:

find . -type f -exec grep -H 'abc' {} +

这将调用每个文件(并通过使用多个文件作为参数进行调用来grep最小化 的实例数量)。grepgrep

答案3

find ./ -type f -exec grep -H abc {} \;

或者

grep -R 'abc' ./

答案4

尝试awk代替cat andgrep

find . -type f | xargs awk '/abc/{printf "%s is from %s\n", $0, FILENAME}'

或者只是使用findawk

find . -type f -exec awk '/abc/{printf "%s is from %s\n", $0, FILENAME}' {} +

相关内容