如何使用 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.java
或 MobileAppServlet.class
或 MobileAppServlet.txt
;'MobileAppASer*.*'
是做同样事情的另一种方式。)
要检查更多参数,请使用 man grep 命令。
【讨论】:
*
有什么关系?它会导致 shell 通配符扩展(如果存在与通配符模式匹配的文件名),或者 grep 会将其作为 *
前面的字符的 0 个或多个重复运算符。
现在让我们考虑grep -nr MobileAppSer* .
的两种可能性 1. 假设我们在当前目录中有3 个文件匹配MobileAppSer*
通配符模式:命名为MobileAppServlet.java
、MobileAppServlet.class
、MobileAppServlet.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|$" *
将搜索 yourstring
或 yourotherstring
匹配的列表位置
【讨论】:
【参考方案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】:
以下示例递归查找位于文件夹path1
、path2
和path3
内某处的*.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 查找仅/更多指定字母的单词?