如何在unix中的特定文件中搜索文本
我正在使用Ubuntu机器,并尝试使用以下命令来搜索文本:
该命令用于递归检查该单词是否存在于给定的目录中:
1)这里<hello>
是我搜索的词,它从当前目录开始以递归方式搜索所有文件。 它工作正常。
grep -r "<hello>" .
2)现在我想限制搜索只有特定的文件,只对xml
文件说:
grep --include=*.{java} -rnw '/home/myfolder/' -e "<hello>"
这一次命令花费更多时间,最终没有给出任何结果。 但我的文件有内容。
我已经通过这个链接 - 如何在Linux上查找包含特定文本的所有文件? 编写我的第二个命令。
我的第二个命令有什么问题吗? 另外还有一个可以快速执行的替代命令?
使用find
可能会更好,因为grep
的include / exclude可能会让人困惑:
find -type f -name "*.xml" -exec grep -l 'hello' {} +
这将查找名称以.xml
文件,并对它们执行grep 'hello'
。 用-l
(L)我们使文件名被打印,没有匹配的行。
说明
find -type f
这会在给定的目录结构中找到文件。 -name "*.xml"
选择名称以.xml
文件。 -exec
对find
命令的每个结果执行一个命令。 -exec grep -l 'hello' {} +
在给定文件上执行grep -l 'hello'
。 使用{} +
我们引用匹配的名称(就像做grep 'hello' file
但引用find
命令提供的文件的名称)。 另外, grep -l
(L)返回文件名,而不是匹配本身。 好的,所以问题是 - XML
不是纯文本,但看起来很相似。 因此,它不适合'传统'选择。
我可以建议看看[ xml_grep][1]
这是一个为此目的而附带XML::Twig
软件包的实用程序吗?
或者,如果您能够更具体地说明您的源内容和期望的输出结果,我们可以提供更具体的答案。
无论如何,除此之外 - 我不会做递归grep,而是find -exec
。 find
可以让你首先过滤文件,而且效率很高......但是实际上没有解决你必须阅读每个匹配的文件才能检查的事实。
这对我来说很有用,用GNU grep
搜索*.xml
和*.java
文件:
grep --include=*.{xml,java} -rl '/path' -e 'hello'
在你的问题中,你有-w
作为标志,这意味着匹配整个单词。