find . -type f -print -exec cat {} \; | grep some string
上述命令不打印文件路径。
我在用着:Ubuntu, bash 4
。
答案1
这是因为您输入的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"
答案2
我用:
grep "some string" . -R
而且效果很快。
更复杂的用例:
grep -HiRE "some string|other string"
# switches used:
# -H for file printing,
# -i for case-insensitive,
# -R for recursive search,
# -E for regex
显示参数的帮助i
:
grep --help | grep -- -i
答案3
我经常在复杂的文件夹结构中搜索源代码,我发现使用以下方法很有用:
cd /your/folder/
grep -rHino "your string"
有了这些参数,无需使用 find,我得到文件完整路径和电话号码包含指定字符串。
它也很容易记住,因为它重击通过你的搜索犀牛:)
我将通过一个简单的例子来展示它是如何工作的。
让我们使用 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
正如你在输出中看到的,我们有文件名:命中行:搜索字符串
以下是所用参数的更详细描述:
-r对于每个目录操作数,递归读取并处理该目录中的所有文件。遵循命令行上的符号链接,但跳过递归遇到的符号链接。请注意,如果没有给出文件操作数,grep 将搜索工作目录。这与“--directories=recurse”选项相同。
-我忽略大小写。
-n在输出的每一行前面加上输入文件中以 1 为基础的行号作为前缀。(-n 由 POSIX 指定。)
-H打印每个匹配的文件名。当要搜索的文件不止一个时,这是默认设置。
-o仅打印匹配行中匹配的(非空)部分,每个部分位于单独的输出行上。输出行使用与输入相同的分隔符,如果还使用了 -z(--null-data),则分隔符为空字节(请参阅其他选项)。