如何在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作为标志,这意味着匹配整个单词。
