我在目录树中寻找字符串foo=在文本文件中。在一个普通的Linux机器上,我有bash shell:

grep -ircl "foo=" *

目录中还有许多匹配“foo=”的二进制文件。由于这些结果不相关并降低了搜索速度,所以我希望grep跳过搜索这些文件(主要是JPEG和PNG图像)。我该怎么做呢?

我知道有——exclude=PATTERN和——include=PATTERN选项,但模式格式是什么?grep的手册页说:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

搜索grep包括,grep包括排除,grep排除和变体没有找到任何相关的

如果有更好的方法只在某些文件中进行grepping,我完全赞成;移动有问题的文件是行不通的。我不能只搜索某些目录(目录结构很混乱,到处都是东西)。此外,我不能安装任何东西,所以我必须使用常用工具(如grep或建议的find)。


当前回答

在grep 2.5.1中,您必须将这一行添加到~/。Bashrc或~/。bash配置文件

export GREP_OPTIONS="--exclude=\*.svn\*"

其他回答

请看看ack,它正是为这些情况而设计的。你的例子

grep -ircl --exclude=*.{png,jpg} "foo=" *

ack as完成了吗

ack -icl "foo="

因为ack在默认情况下从不在二进制文件中查找,而-r在默认情况下是打开的。如果您只想要CPP和H文件,那么就这样做

ack -icl --cpp "foo="

如果您只想跳过二进制文件,我建议您查看-I(大写I)选项。它忽略二进制文件。我经常使用以下命令:

grep -rI --exclude-dir="\.svn" "pattern" *

它会递归搜索,忽略二进制文件,并且不会在Subversion隐藏文件夹中查找我想要的任何模式。我在我工作的盒子上用"grepsvn"作为别名。

在目录中还有许多二进制文件。我不能只搜索某些目录(目录结构是一个大混乱)。有没有更好的方法只在特定的文件中进行grepping ?

ripgrep

这是设计用于递归搜索当前目录的最快工具之一。它是用Rust编写的,构建在Rust的正则表达式引擎之上,以获得最大的效率。点击这里查看详细分析。

所以你可以运行:

rg "some_pattern"

它尊重你的.gitignore和自动跳过隐藏文件/目录和二进制文件。

您仍然可以使用-g/——glob自定义包含或排除文件和目录。Globbing规则匹配。gitignore globs。联系rg寻求帮助。

有关更多示例,请参见:如何使用grep排除与某些扩展名不匹配的文件?

在macOS上,你可以通过brew install ripgrep进行安装。

我在很长一段时间后发现,你可以添加多个包含和排除,比如:

grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js

适用于TCSH .alias文件:

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

花了我一段时间才弄清楚{mm,m,h,cc,c}部分不应该在引号内。 ~基斯