find . -type f -print -exec cat {} \; | grep some string
上面的命令不会显示文件路径。
我正在使用:Ubuntu, bash 4
。
ack
grep浏览当前目录下的所有文件,可能仅过滤某些文件类型。
find . -type f -print -exec cat {} \; | grep some string
上面的命令不会显示文件路径。
我正在使用:Ubuntu, bash 4
。
ack
grep浏览当前目录下的所有文件,可能仅过滤某些文件类型。
Answers:
那是因为您要提供grep
的文本流恰好包含文件名。由于您没有提供文件名作为grep的参数,因此不能期望得出匹配行来自哪个文件。用途xargs
:
find . -type f -print | xargs grep "some string"
由于您具有GNU find / xargs,因此这是xargs读取文件名的更安全方法:
find . -type f -print0 | xargs -0 grep "some string"
如果只希望文件名具有匹配行而不显示匹配行:
find . -type f -print0 | xargs -0 grep -l "some string"
sed '...' $(find ... | xargs grep -l ...)
我用
grep "some string" . -R
而且它工作更快
ps
更复杂的用例
grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex
阅读参数我的解释
grep --help | grep -- -i
-n
如果你想行号。+1简化答案。
我经常在复杂的文件夹结构中搜索源代码,并且发现使用以下命令很有用:
cd /your/folder/
grep -rHino "your string"
使用这些参数,无需使用find即可获取文件的完整路径和包含指定string的行号。
这也很容易记住,因为它像rHino一样通过搜索BASH:)
我将通过一个简单的示例来说明这是如何工作的。
让我们使用cat显示文件的内容:
jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
让我们递归搜索所有包含字符串“ iptables -P”的文件:
jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P
如您在输出中看到的,我们有filename:hit row:searched字符串
这是所用参数的更详细说明:
-r对于每个目录操作数,以递归方式读取和处理该目录中的所有文件。在命令行上遵循符号链接,但是跳过递归遇到的符号链接。请注意,如果未提供文件操作数,则grep将搜索工作目录。这与“ --directories = recurse”选项相同。
-i打印每个匹配项的文件名。当要搜索多个文件时,这是默认设置。
-n在输出的每一行之前在其输入文件中添加基于1的行号。(-n由POSIX指定。)
-H打印每个匹配项的文件名。当要搜索多个文件时,这是默认设置。
-o仅打印匹配行的匹配(非空)部分,每个这样的部分在单独的输出行上。输出行使用与输入相同的定界符,如果还使用了-z(--null-data),则定界符为空字节(请参阅其他选项)。
Silver Searcher是一种非常便捷的工具,用于搜索文件和内容。
为了解决您的问题,silver searcher命令将如下所示:
ag 'some string' -l
-l
仅打印包含匹配项的文件名(不打印匹配行)
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string