关于bash:Colorized grep – 使用突出显示的匹配查看整个文件

Colorized grep — viewing the entire file with highlighted matches

我发现grep--color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。考虑到它打印的每一行都有一个匹配项,突出显示并没有增加尽可能多的功能。

我真的想用cat一个文件来查看整个文件,并突出显示模式匹配。

有什么方法可以让grep打印每一行正在阅读的内容,不管是否有匹配的内容?我知道我可以编写一个脚本来在文件的每一行上运行grep,但是我很好奇标准的grep是否可以这样做。


以下是一些方法:

1
2
3
grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file


这是同一条线的东西。很有可能,你会用的更少,所以试试这个:

1
less -p pattern file

它将突出显示该模式,并跳转到文件中第一个出现的模式。


我想推荐ACK——比GREP更好,它是一种面向程序员的强大搜索工具。

1
$ ack --color --passthru --pager="${PAGER:-less -R}" pattern files
1
$ ack --color --passthru pattern files | less -R
1
2
$ export ACK_PAGER_COLOR="${PAGER:-less -R}"
$ ack --passthru pattern files

我喜欢它,因为它默认为目录的递归搜索(并且比grep -r聪明得多),支持完整的Perl正则表达式(而不是posixish regex(3)),并且在搜索许多文件时具有更好的上下文显示。


也可以创建别名。在.bashrc(或osx上的.bash_配置文件)中添加此函数

1
2
3
function grepe {
    grep --color -E"$1|$" $2
}

您现在可以使用这样的别名:"ifconfig | grepe inet"或"grepe css index.html"。

(附言:别忘了让source ~/.bashrc在当前会话中重新加载bashrc)


你可以从https://github.com/kepkin/dev-shell-essentials使用我的highlight脚本

它比grep好,因为你可以用自己的颜色突出显示每一个匹配项。

1
$ command_here | highlight green"input" | highlight red"output"

Screen shot from Github project


使用colout程序:http://nojhan.github.io/colout/

它被设计为向文本流添加颜色突出显示。给定一个regex和一个颜色(例如"红色"),它复制一个带有突出显示的匹配项的文本流。例如:

1
2
# cat logfile but highlight instances of 'ERROR' in red
colout ERROR red <logfile

您可以链接多个调用以添加多个不同的颜色突出显示:

1
2
3
4
5
tail -f /var/log/nginx/access.log | \
    colout ' 5\d\d ' red | \
    colout ' 4\d\d ' yellow | \
    colout ' 3\d\d ' cyan | \
    colout ' 2\d\d ' green

或者,您也可以通过使用一个带有n个组(regex的带括号部分)的regex,后跟一个以逗号分隔的n种颜色列表来实现相同的功能。

1
2
3
4
vagrant status | \
    colout \
        '\''(^.+  running)|(^.+suspended)|(^.+not running)'\'' \
        green,yellow,red


我使用来自"Linux服务器黑客"O'Reilly的RCG。它非常适合你想要的,并且可以突出显示多种不同颜色的表达。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/perl -w
#
#       regexp coloured glasses - from Linux Server Hacks from O'Reilly
#
#       eg .rcg"fatal""BOLD . YELLOW . ON_WHITE"  /var/adm/messages
#
use strict;
use Term::ANSIColor qw(:constants);

my %target = ( );

while (my $arg = shift) {
        my $clr = shift;

        if (($arg =~ /^-/) | !$clr) {
                print"Usage: rcg [regex] [color] [regex] [color] ...
"
;
                exit(2);
        }

        #
        # Ugly, lazy, pathetic hack here. [Unquote]
        #
        $target{$arg} = eval($clr);

}

my $rst = RESET;

while(<>) {
        foreach my $x (keys(%target)) {
                s/($x)/$target{$x}$1$rst/g;
        }
        print
}

我把这个添加到我的.bash_别名中:

1
2
3
highlight() {
  grep --color -E"$1|\$"
}

要在查看整个文件时突出显示模式,h可以这样做。

此外,它还为不同的图案使用不同的颜色。

1
cat FILE | h 'PAT1' 'PAT2' ...

您还可以通过管道将EDOCX1的输出(11)传输到less -R,以便更好地阅读。

要使每个图案变灰并使用1种颜色,cxpgrep可能是一个很好的匹配。


对于grep来说,-z选项也相当灵活!

1
cat file1 | grep -z"pattern"

好吧,这是一条路,

1
wc -l filename

会给你行数——比如说nn,你就可以了

1
grep -C NN --color=always filename


另一个答案提到grep的-cn开关,其中包含n行上下文。我有时用n=99来做这件事,作为一种快速而肮脏的方式,当egrep模式显得过于复杂时,或者当我在一台没有安装RCG和/或CCZE的机器上时,获取(至少)一个完整的上下文屏幕。

我最近发现了ccze,它是一种更强大的着色工具。我唯一的抱怨是它是面向屏幕的(如less,我从来没有因为这个原因使用过),除非您为"raw ansi"输出指定-a开关。

+1对于上述的rcg。它仍然是我的最爱,因为在别名中自定义非常简单。像这样的东西通常在我的~/.bashrc中:

alias tailc='tail-f/my/app/log/file rcg send"bold GREEN"receive"青色"error"red"'


下面是一个shell脚本,它使用awk的gsub函数将要搜索的文本替换为正确的转义序列,以亮红色显示:

1
2
#! /bin/bash
awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2

像这样使用它:

1
$ ./cgrep pattern [file]

不幸的是,它没有grep的所有功能。

有关更多信息,您可以参考Linux期刊上的一篇文章"所以您喜欢颜色"。


另一种肮脏的方式:

1
grep -A80 -B80 --color FIND_THIS IN_FILE

我做了一个

1
alias grepa='grep -A80 -B80 --color'

在BASHC中。


或者你可以使用银搜索器

1
ag <search> --passthrough

如果您想突出显示几个不同颜色的图案,请参阅这个bash脚本。

基本用法:

1
echo warn error debug info 10 nil | colog

您可以在按一个键然后按Enter键的同时更改图案和颜色。


我将以下命令用于类似目的:

grep -C 100 searchtext file

这将表示grep在突出显示的搜索文本前后打印100*2行上下文。