Colorized grep - 使用突出显示的匹配查看整个文件

zsl*_*ton 486 bash shell grep colors

我发现它grep--color=always旗帜非常有用.但是,grep只打印带匹配的行(除非您要求上下文行).鉴于它打印的每一行都有一个匹配,突出显示不会增加尽可能多的能力.

我真的很喜欢cat一个文件,看到整个文件突出显示模式匹配.

有什么方法我可以告诉grep打印每一行被读取而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇这是否可以用标准grep.

Rya*_*roi 771

以下是一些方法:

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file
Run Code Online (Sandbox Code Playgroud)

  • 那个| $技巧很整洁!干得好,我必须记住这一点.对于那些不是正则表达式的人来说,"pattern | $"将匹配具有您正在搜索的模式的行和具有结尾的行 - 即所有这些行.因为一行的结尾实际上不是任何字符,所以输出的颜色部分将只是您的图案.谢谢瑞恩! (146认同)
  • 你也可以省略"$":`egrep --color'模式|" 档案`(信用卡http://stackoverflow.com/a/7398092/50979) (53认同)
  • @JBoy,我用传统的英语方式而不是布尔逻辑方式使用'AND'.你是对的,它确实是一个'或'运算符 - 它匹配这个和那个.:P很好的澄清. (16认同)
  • @Zack,"|" operator是OR运算符,而不是AND, (15认同)
  • 如果匹配多个模式,似乎需要"$".`egrep --color"pattern1 | pattern2 | $"`.否则,不会发生颜色突出显示. (12认同)
  • 如果你转义'|',你就不必使用-E标志(扩展正则表达式),如下所示:`grep --color"pattern\| $"file` (6认同)
  • 如果你打算将它管道化为更少并且仍然希望输出变为彩色那么你可能想要使用grep --color = always和alias less ='less -r' (3认同)
  • @qwertyboy这是*GNU*`grep`的一个特性.符合POSIX的`grep`(*not*:`egrep`)仅支持[*Basic*正则表达式(BRE)](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03)没有`-E`,交替是不可能的.(你应该总是使用`egrep`而不是`grep -E`,以确保你可以使用[*Extended*Regular Expressions(EREs)](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09 .html #tag_09_04).` grep`实现各不相同.) (3认同)
  • [正则表达式引导](http://www.regular-expressions.info/engine.html)需要"$",就像OS X Mountain Lion和Mavericks上的`grep`一样. (2认同)

Pau*_*ce. 89

这是一回事.很可能,你会少用,所以试试这个:

less -p pattern file
Run Code Online (Sandbox Code Playgroud)

它将突出显示模式并跳转到文件中第一次出现的模式.

  • 也可以使用`-`:`... |来管道(从stding读取)少-p pattern -` (4认同)
  • 此外,添加“-i”选项将使匹配大小写不敏感,如“less -ip 模式文件”中那样。 (4认同)
  • @phk:你甚至可以省略破折号. (3认同)
  • ...如果使用 ANSI 颜色输入进行管道传输,请使用“-R”开关提供“less”:“... | less -Rip介绍-` (2认同)

eph*_*ent 46

我想推荐ack - 比grep更好,这是程序员的强大搜索工具.

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

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

  • @MPi`ack -a`将搜索所有文件类型,同时仍然排除`.git /``.svn /`等. (4认同)
  • 通过一些配置调整,grep已经完成了ack所做的一切,更快,并且永远不会忽略像ack的白名单有时那样的结果.也许在.bashrc中保存您首选的grep设置.我读:函数grp(){GREP_OPTIONS =" - rI --color --exclude-dir =\.git --exclude = tags"grep"$ @" (3认同)
  • 但是,有时,当我确定它必须在那里时,它不会找到我想要的东西。`ack` 很聪明,但有时太聪明了,它排除了命中所在的文件类型。 (2认同)

Fab*_* Sa 18

您还可以创建别名.在.bashrc中添加此函数(或在osx上添加.bash_profile)

function grepe {
    grep --color -E "$1|$" $2
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Hoten使用`--color = always`而不是`--color` (4认同)
  • 并且,为了使'less`解释颜色代码,请使用`less -R`. (2认同)

kep*_*kin 18

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

这比因为你可以用自己的颜色突出显示每个匹配更好.grep

$ command_here | highlight green "input" | highlight red "output"
Run Code Online (Sandbox Code Playgroud)

Github项目的屏幕截图

  • 问题明确要求使用`grep`解决方案,这是运行*nix的机器上的标准实用程序. (3认同)
  • 这个脚本很好,但不如另一个答案中提到的“colout”。 (2认同)

use*_*246 13

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

它旨在为文本流添加颜色突出显示.给定正则表达式和颜色(例如"红色"),它再现具有突出显示的匹配的文本流.例如:

# cat logfile but highlight instances of 'ERROR' in red
colout ERROR red <logfile
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

或者你可以通过使用带有N组的正则表达式(正则表达式的带括号的部分),然后是逗号分隔的N种颜色列表来实现相同的功能.

vagrant status | \
    colout \
        '\''(^.+  running)|(^.+suspended)|(^.+not running)'\'' \
        green,yellow,red
Run Code Online (Sandbox Code Playgroud)

  • @Zack好的,对不起.实际上,如果你将问题扩展到`grep`之后,并且它已经在答案中扩展了,那么`colout`是你遇到问题的最佳解决方案,也是我所知道的最好的解决方案.根据UNIX哲学,编写程序应该做好一件事.对于`grep`,它是过滤文本流.对于`colout`,它是着色或突出显示文本流. (3认同)

V.7*_*V.7 13

正如grep -E '|pattern'已经建议的那样,只是想澄清一下,也可以突出显示整行。

例如,tail -f somelog | grep --color -E '| \[2\].*'(具体来说,部分-E '|):


小智 7

我使用了来自"Linux Server Hacks"的rcg,O'Reilly.它非常适合您的需求,并且可以突出显示不同颜色的多个表达.

#!/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] ...\n";
                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
}
Run Code Online (Sandbox Code Playgroud)


Abh*_*ngh 6

-zgrep 的选项也很漂亮!

cat file1 | grep -z "pattern"
Run Code Online (Sandbox Code Playgroud)

  • 这就是我一直在寻找的答案。用于管道时效果良好。 (2认同)

Bru*_*dge 6

使用 ripgrep,又名 rg: https: //github.com/BurntSushi/ripgrep

rg——通道...

颜色为默认值:

在此输入图像描述

  rg -t tf -e  'key.*tfstate' -e dynamodb_table
       --passthru
       Print both matching and non-matching lines.

       Another way to achieve a similar effect is by modifying your pattern to
       match the empty string. 
       For example, if you are searching using rg foo then using 
       rg "^|foo" instead will emit every line in every file searched, but only
       occurrences of foo will be highlighted. 
       This flag enables the same behavior without needing to modify the pattern.
Run Code Online (Sandbox Code Playgroud)

亵渎,这是理所当然的,但 grep 已经变得自满了。

brew/apt/rpm/whatever install ripgrep

你永远不会回去。


小智 5

我将此添加到我的.bash_aliases中:

highlight() {
  grep --color -E "$1|\$"
}
Run Code Online (Sandbox Code Playgroud)


F. *_*uri 5

sed方式

前言

这个答案使用GNU sed. 这适用于该工具的非常旧版本(使用 2012 版本进行了测试sed (GNU sed) 4.2.2,但这也适用于旧版本。)

不幸的是,如果在 MacOS 上,您可能必须使用brew.

sed解决方案的强大功能和灵活性

由于已经有很多不同的解决方案,但没有一个解决方案显示sed为解决方案,
并且因为sed比更轻、更快grep,所以我更喜欢用于sed此类工作:

sed 's/pattern/\o33[47;31;1m&\o033[0m/' file
Run Code Online (Sandbox Code Playgroud)

这似乎不太直观。

  • s/pattern/replaced/sed替换命令,替换patternreplaced
  • \o33sed生成字符octal 033-> 的语法Escape
    (某些 shell 和编辑器还允许输入<Ctrl>-<V>后跟<Esc>, 来直接键入字符。)
  • Esc [ 47 ; 31 ; 1 m是一个ANSI 转义码:背景灰色,前景红色和粗体。
  • &将重新打印pattern.
  • Esc [ 0 m将颜色恢复为默认值。

您也可以突出显示整行,但将其标记pattern为红色:

sed -E <file -e \
    's/^(.*)(pattern)(.*)/\o33[30;47m\1\o33[31;1m\2\o33[0;30;47m\3\o33[0m/'
Run Code Online (Sandbox Code Playgroud)

动态tail -f,用于实时跟踪日志文件

使用的优点之一sed:您可以使用Bell ascii 字符在控制台上发送警报蜂鸣声。我经常使用 sed 像: 0x7

sudo tail -f /var/log/kern.log |
    sed -ue 's/[lL]ink .*\([uU]p\|[dD]own\).*/\o33[47;31;1m&\o33[0m\o7/'
Run Code Online (Sandbox Code Playgroud)

或者,如果使用systemd

sudo journalctl -akf |
    sed -ue 's/[lL]ink .*\([uU]p\|[dD]own\).*/\o33[47;31;1m&\o33[0m\o7/'
Run Code Online (Sandbox Code Playgroud)
  • -u代表无缓冲。这可确保该线路立即得到处理。

因此,当我连接或断开以太网电缆时,我会立即听到一些蜂鸣声。

当然,link up您可以在同一个文件中监视USB,而不是模式,或者......

优点sed

例如:您是查理,正在等待来自爱丽丝鲍勃的邮件,通过您的邮件服务器传输:

所以你必须from=.*\(alice\|bob\)@someserver.org在 中搜索/var/log/mail.log。作为sed一种语言,您可以使用许多指令,例如:在监视某些邮件服务器上的传入请求时避免imap并记录:pop

tail -f /var/log/mail.log | sed -ue '
    /[[:space:]]\(imap\|pop\)d\[/d;
    /[^[:alnum:]]smtpd\[/{ 
        s/.*/\o33[30;47m&\o33[0m/;
        s/\(alice\|bob\)@someserver.org/\o33[31;1m\o7&\o33[30m/g;
    }
'
Run Code Online (Sandbox Code Playgroud)

这会

  • 删除有关imappop服务器的行。
    (包含imapd[或 的行popd[),
  • smtp突出显示有关服务器的行
    (包含的行smtpd[)和
  • 对于包含 的行,当找到包含或 的smtpd[行时,突出显示并发出蜂鸣声。alice@someserver.orgbob@someserver.org
  • 然后打印所有未删除的行(因为-n未使用开关)。