如何使用 grep 在文件夹中查找单词?

Posted

技术标签:

【中文标题】如何使用 grep 在文件夹中查找单词?【英文标题】:How can I use grep to find a word inside a folder? 【发布时间】:2011-05-06 12:40:03 【问题描述】:

在 Windows 中,我会搜索文件夹中的单词。同样,我想知道特定单词是否出现在包含许多子目录和文件的目录中。我对 grep 语法的搜索显示我必须指定文件名,即grep string filename

现在,我不知道文件名,我该怎么办? 一个朋友建议做grep -nr string,但我不知道这是什么意思,我没有得到任何结果(直到我发出 Ctrl + C)。

【问题讨论】:

【参考方案1】:
grep -nr 'yourString*' .

末尾的点搜索当前目录。每个参数的含义:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' .(会找到 MobileAppServlet.javaMobileAppServlet.classMobileAppServlet.txt'MobileAppASer*.*' 是做同样事情的另一种方式。)

要检查更多参数,请使用 ma​​n grep 命令。

【讨论】:

* 有什么关系?它会导致 shell 通配符扩展(如果存在与通配符模式匹配的文件名),或者 grep 会将其作为 * 前面的字符的 0 个或多个重复运算符。 现在让我们考虑grep -nr MobileAppSer* . 的两种可能性 1. 假设我们在当前目录中有3 个文件匹配MobileAppSer* 通配符模式:命名为MobileAppServlet.javaMobileAppServlet.classMobileAppServlet.txt。然后grep 将像这样被调用:grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .。这意味着在文件 MobileAppServlet.java、MobileAppServlet.txt 和当前目录的其他地方搜索文本“MobileAppServlet.class”——这肯定不是用户想要的。 2.如果当前目录中没有与MobileAppSer* 通配符模式匹配的文件,grep 将按原样接收参数MobileAppSer*,因此会将其作为搜索文本“MobileAppSe”,然后出现 0 次或多次“r”,因此它将尝试在当前目录的文件内容中查找文本“MobileAppSe”、“MobileAppSer”、“MobileAppSerr”、“MobileAppSerrr”等 - 也不是用户想要的。 这是一个可疑的正则表达式选择。乌斯塔指出了这一点。【参考方案2】:
grep -nr string my_directory

附加说明:这满足语法grep [options] string filename,因为在类 Unix 系统中,目录是一种文件(有一个术语“常规文件”专门指在 Windows 中称为“文件”的实体)。

grep -nr string 从标准输入读取要搜索的内容,这就是为什么它只是在那里等待您的输入,并在您按下 ^C 时停止这样做(它也会在 ^D 上停止,这是文件结尾的组合键)。

【讨论】:

嘿,如果我想不分大小写地搜索一个字符串,我必须这样做:grep -i -nr "my word" 。 @kiki:是的,相当于grep -inr "my word" . @kiki: -r for grep 表示递归搜索子目录,-n 表示在每行输出前加上包含该行的文件的相应行号。 man grep 描述了所有这些以及更多内容。【参考方案3】:

GREP:全局正则表达式打印/解析器/处理器/程序。 您可以使用它来搜索当前目录。 你可以指定 -R 为“递归”,这意味着程序搜索所有的子文件夹,以及它们的子文件夹,以及它们的子文件夹的子文件夹等。

grep -R "your word" .

-n 将打印文件中匹配的行号。-i 将搜索不区分大小写(大写/非大写字母)。

grep -inR "your regex pattern" .

【讨论】:

./* 表示当前目录下的所有文件,-R 表示递归(搜索子目录等) 谢谢。 grep -inR "[0-9a-fA-F]32" . 帮助在当前目录的文件中查找哈希(十六进制字符串)。 ***.com/a/25724915/470749【参考方案4】:

还有:

find directory_name -type f -print0 | xargs -0 grep -li word

但这对于初学者来说可能有点多。

find 是一个通用的目录walker/lister,-type f 表示“查找普通文件而不是目录和命名管道以及你有什么”,-print0 表示“使用空字符在标准输出上打印它们作为分隔符”。 find 的输出被发送到 xargs -0 并使用空字符作为记录分隔符(而不是标准换行符)以块的形式获取其标准输入(以避免命令行长度限制),然后将 grep -li word 应用于每个文件集。在grep 上,-l 表示“列出匹配的文件”,-i 表示“不区分大小写”;您通常可以组合单个字符选项,因此您会看到-li-l -i 更频繁。

如果您不使用-print0-0,那么您会遇到文件名包含空格的问题,因此使用它们是一个好习惯。

【讨论】:

我可以排除某些目录吗? @muistooshort @Ferologics 应该有,从命令行检查man find,看看你的find 支持哪些选项。【参考方案5】:
grep -nr search_string search_dir

将对 search_string 进行 RECURSIVE(即目录及其所有子目录)搜索。 (正如 usta 正确回答的那样)。

您朋友的建议没有得到任何答复的原因:

grep -nr string

是因为没有指定目录。如果您位于要在其中进行搜索的目录中,则必须执行以下操作:

grep -nr string .

包含“.”很重要字符,因为这告诉 grep 搜索 THIS 目录。

【讨论】:

嗨,如果我必须搜索两个单词之间有空格,我该怎么办?是否应该在引号中指定单词?即 grep -nr “我的话”。【参考方案6】:

为什么不进行递归搜索以查找子目录中的所有实例:

grep -r 'text' *

这就像一个魅力。

【讨论】:

无需引用没有特殊字符(如空格)的搜索字符串【参考方案7】:

我喜欢使用的另一个选项:

find folder_name -type f -exec grep your_text   \;

-type f 只返回文件而不返回文件夹

-exec 和 对在搜索中找到的文件运行 grep(确切的语法是“-exec command ”)。

【讨论】:

【参考方案8】:
    grep -r "yourstring" * 将在任何文件和文件夹中找到“yourstring”

现在,如果您想同时查找两个不同的字符串,您可以随时使用选项 E 并添加单词进行搜索。休息后的例子

    grep -rE "yourstring|yourotherstring|$" * 将搜索 yourstringyourotherstring 匹配的列表位置

【讨论】:

【参考方案9】:
grep -R "string" /directory/

-R 也跟随符号链接,而 -r 不跟随。

【讨论】:

【参考方案10】:

与@eLRuLL 发布的答案类似,指定尊重单词边界的搜索的更简单方法是使用-w 选项:

grep -wnr "yourString" .

【讨论】:

在 cmd 提示符或 windows 终端中无法识别术语 grep @kouty grep 是一个 Unix 命令。 itechtics.com/using-findstr-windows【参考方案11】:

您选择的答案很好,并且有效,但这不是正确的方法,因为:

grep -nr yourString* .

这实际上搜索字符串"yourStrin""g" 0 次或多次。

所以正确的做法是:

grep -nr \w*yourString\w* .

此命令在当前文件夹中搜索前后任意字符的字符串。

【讨论】:

但是grep -nr yourString 也可以工作,因为它会在行中的任何地方寻找裸露的yourString(或者至少它在我的系统上,OSX Lion)【参考方案12】:

以下示例递归查找位于文件夹path1path2path3 内某处的*.xml*.js 文件中的your search string

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

因此,您可以在文件的子集中搜索多个目录,只需在末尾提供路径即可。

【讨论】:

【参考方案13】:

在目录中运行(终端)以下命令。它也会递归检查子目录。

grep -r 'your string goes here' * 

【讨论】:

【参考方案14】:

不要使用 grep。下载Silver Searcher 或ripgrep。它们都很出色,而且比 grep 或 ack 更快,有很多选项。

【讨论】:

这些可能是很棒的工具,但这并不能回答我将如何使用这些工具来完成 OP 的要求。

以上是关于如何使用 grep 在文件夹中查找单词?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用数组中的 preg_grep 查找仅/更多指定字母的单词?

如何使用 grep 命令获取连续有六个或更多辅音的单词列表?

如何从另一个文件中的一个文件中查找单词?

如何查找不包含给定字符串模式的文件?

在 php 中使用 grep 命令在特定文件中查找字符串

grep 命令系列:如何在 UNIX 中根据文件内容查找文件