如何使用GNU grep突出显示匹配项?


18

我在某些Linux上看到过,它grep配置为突出显示匹配项并打印匹配文件。

如何配置grep突出显示匹配项?

Answers:


10
alias cgrep='grep -nR --color'

用法:

$ cgrep somestring /path/to/dir/or/file/with*/possible/*wild.card

也是我的最爱之一:

$ pgrep some-hanging-process

将列出与某些挂起进程名称匹配的所有进程的pid,您可以在以下情况下使用该进程:

$ kill $(pgrep some-hanging-process)

12
最后一个有pkill命令
diega,2010年

1
在最新版本的GNU中grepgrep -r通常应优先使用GNU ,grep -R因为前者不会遍历符号链接。
斯特凡Chazelas

19

我发现最好的方法是使用ack,这实际上是具有智能忽略列表的递归grep(例如,不搜索.svn目录,忽略备份文件等),对结果进行高亮显示和Perl正则表达式。您希望grep在98.6%的时间内执行此操作。


5
+1表示确认。不要忘记添加--pager =“ less -R”选项,以保持突出显示分页结果。可能还值得一提的是,在Ubuntu上,由于采用了“ ack”,因此被称为“ ack-grep”。
肖恩·钦

我也使用ack,但有时您无法使用它
。–

2
由于ack只是一个perl脚本,因此您可以在安装了perl的任何地方使它可用,这并不是一个高标准。

Ack非常适合使用默认的默认设置,但是在安装ack时,您可能已经为grep配置了一些默认设置-请在此页的其他位置查看我的答案。我在1980年代曾经做过一次,从那时起grep就做了ack所做的一切。(尽管ack大声宣称相反,但只有grep实际上更快)
Jonathan Hartley

7

我在.bashrc中设置了它,而不是使用别名重新定义grep:

    export GREP_OPTIONS="--color=auto"

对我来说,这适用于Linux,MacOSX和FreeBSD。


GREP_OPTIONS应该被认为是有害的。我建议改为使用alias。看到这里:bugs.launchpad.net/ubuntu/+bug/67141
lesmana 2011年

我同意在某些脚本中GREP_OPTIONS可能会出现问题。但是,正如我在错误67141中所指出的那样,GREP_OPTIONS允许用户为多种形式的grep(grep,egrep,fgrep,rgrep,zgrep,bzgrep,bzfgrep,bzegrep等)设置一个选项。每种形式的* grep,而且grep的类型很多。
Stefan Lasiewski 2011年

我曾经使用GREP_OPTIONS多年(不,几十年),但是它造成的伤害却是非常真实的。任何使用此env var集调用grep的工具都将继承您修改后的默认行为,这将破坏这些工具。通过定义别名或可执行的包装脚本来完全避免此问题。
乔纳森·哈特利

脚本必须清理其环境。不允许,但是,允许。期。(是的,这是下背部的皇家疼痛...)。
vonbrand 2013年

3

我建议避免使用环境变量GREP_OPTIONS,它将影响grep的每次调用,甚至包括嵌入在其他工具中的grep。如果这些工具期望grep表现出一种方式,而您改变了这种行为,它将并且确实破坏了这些工具。

相反,您可以创建一个效果很好的别名。这只会影响从您的交互式外壳程序对grep的调用(即您键入自己的名字)。

我最喜欢的最后一个选择是创建一个调用grep的包装器脚本。我更喜欢使用别名,因为我可以从其他程序调用此包装器。例如,通过设置vimgrep进入vim,以便在vim中进行的搜索与在命令行中进行的搜索相同。

$ cat `which grp`
#!/usr/bin/env bash
grep -rI --color --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude=tags $*

使用以下命令进行调用:

$ grp pattern dir

例如

$ grp pattern .

将在当前目录和子目录的所有文本文件中搜索“模式”的实例。

请注意,我将脚本称为“ grp”,而不是“ grep”,因此我始终知道我是否在使用自定义默认值调用grep。

默认情况下,我包括:

-r : search subdirs recursive
-I : skip binary files
--color : highlight matches in color
--exclude-dir : skip specified directories and their subdirs
--exclude : skip specified files

我认为每个人都想跳过源代码管理目录:.hg .git .bzr .svn

跳过“ build”和“ dist”是Python主义,可能不适用于大多数人。毫无疑问,您将在工作时发展自己的特质。

'tags'是ctags的输出,我在'vim'等工具中使用了'tags'来定义函数。因此,它包含我的源代码中每个单词和符号的至少一个副本,因此值得从搜索结果中跳过。

最后的“ $ *”是bash语法,用于“以及命令行中的所有其他参数”,因此您可以传递模式和dir进行常规搜索,并覆盖您想要的任何其他命令行标志。


2

--color选项已经被提及了好几次了,但是我想补充一点,可以使用环境变量配置突出显示匹配项的颜色

export GREP_COLOR="1;33"

颜色应使用ANSI颜色代码进行编码,以供参考

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37

1
GREP_COLOR不推荐使用。使用GREP_COLORS代替。
g33kz0r 2012年

2

由于我没有看到任何实际设置颜色的示例,因此这是GNU grep的简单设置:

# turn on colors, natch.
export GREP_OPTIONS="--color=auto"

if [[ $(echotc Co) -ge 256 ]]; then
  # 256 color terminals
  export GREP_COLORS="mt=38;5;118:sl=:cx=:fn=38;5;18:ln=1;30:bn=37:se=30"
else
  # everybody else
  export GREP_COLORS="mt=31:sl=:cx=:fn=34:ln=1;30:bn=30:se=30"
fi

小心点GREP_OPTIONS; 请勿将其用于其他任何事情--color=auto,否则会弄乱在系统上使用grep的所有脚本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.