我有一个文本文件的文件夹树,我想查找子字符串的实例以及它们来自的文件的名称。
如果我做类似的事情:
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 | grep
,grep
只会看到一个无名输入流,其中包含所有文件的串联内容。改为:
find . -type f -exec grep -H 'abc' {} +
这将调用每个文件(并通过使用多个文件作为参数进行调用来grep
最小化 的实例数量)。grep
grep
答案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}'
或者只是使用find
和awk
find . -type f -exec awk '/abc/{printf "%s is from %s\n", $0, FILENAME}' {} +