如何用`find`和`grep`做一个“where”子句的等价物

ak0*_*000 3 grep bash find

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

如果我做这样的事情:

find . | xargs cat | grep 'abc'
Run Code Online (Sandbox Code Playgroud)

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

谢谢您的帮助!

ilk*_*chu 8

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

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

find . -type f | xargs grep -l hello
Run Code Online (Sandbox Code Playgroud)

或者只是grep -r递归地遍历目录,还可以解决xargs包含空格或引号的文件名的问题:

grep -lre abc .
Run Code Online (Sandbox Code Playgroud)

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


xen*_*oid 7

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

find . -type f -exec grep -H 'abc' {} +
Run Code Online (Sandbox Code Playgroud)

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

  • `-H` 不是标准的。脚本继承者很容易被几乎所有的东西弄糊涂,我认为这没有任何区别;-) (2认同)