使用 find (1) 和 grep (1) 查找包含特定字符串的文件

使用 find (1) 和 grep (1) 查找包含特定字符串的文件

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),则分隔符为空字节(请参阅其他选项)。

答案4

银搜索者是一种非常快速且方便的文件和内容搜索工具。

为了解决您的问题,银色搜索器命令看起来像这样......

ag 'some string' -l

-l仅打印包含匹配项的文件名(不打印匹配的行)

相关内容