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

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

我真的cat一个文件,并看到整个文件与突出显示模式匹配。

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

这里有一些方法来做到这一点:

 grep --color -E 'pattern|$' file grep --color 'pattern\|$' file egrep --color 'pattern|$' file 

这里有一些相同的内容。 机会是,你会less用,所以试试这个:

 less -p pattern file 

它会突出显示该模式并跳转到文件中的第一个匹配项。

我想推荐ack – 比grep更好,这是一个程序员的电力search工具 。

 $ ack --color --passthru --pager =“$ {PAGER:-less -R}”模式文件
 $ ack --color --passthru模式文件| 减去-R
 $ export ACK_PAGER_COLOR =“$ {PAGER:-less -R}”
 $ ack --passthru模式文件

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

你也可以创build一个别名。 将这个函数添加到.bashrc(或osx上的.bash_profile)

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

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

(PS:不要忘记发送source ~/.bashrc来重新加载当前会话的bashrc)

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

这比grep ,因为你可以使用自己的颜色来突出每个匹配。

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

从Github项目的屏幕截图

使用colout程序: http : colout

它旨在为文本stream添加颜色突出显示。 给定一个正则expression式和一个颜色(例如“红色”),它会再现一个突出显示匹配的文本stream。 例如:

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

您可以链接多个调用以添加多个不同颜色的高光:

 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个正则expression式的正则expression式(正则expression式的括号部分)来实现相同的效果,然后用逗号分隔N个颜色列表。

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

我使用O'Reilly的“Linux Server Hacks”中的rcg。 这是完美的你想要什么,并可以突出显示不同颜色的多个expression式。

 #!/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 } 

好的,这是一种方法,

 wc -l filename 

会给你的行数 – 说NN,那么你可以做

 grep -C NN --color=always filename 

这里是一个使用Awk的gsub函数的shell脚本,用正确的转义序列replace正在search的文本,以红色显示:

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

像这样使用它:

 $ ./cgrep pattern [file] 

不幸的是,它没有grep的所有function。

有关更多信息,请参阅Linux Journal中的“ So You Like Color ”一文

另一个答案提到了grep的-Cn开关,它包含n行Context。 我有时用n = 99来做这件事情,当egrep模式看起来太复杂时,或者当我在一台没有安装rcg的机器上时,这是一种快速又脏的方法,和/或ccze。

我最近发现ccze是一种更强大的着色剂。 我唯一的抱怨是它是面向屏幕的(就像less ,我从来没有使用这个原因),除非你指定“原始ANSI”输出-A开关。

上面提到的rcg +1。 这是我最喜欢的,因为它是很容易定制的别名。 像这样的东西通常在我的〜/ .bashrc中:

别名tailc ='tail -f / my / app / log / file | rcg发送“BOLD GREEN”收到“CYAN”错误“RED”

我将这添加到我的.bash_aliases:

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

另一个脏方式:

 grep -A80 -B80 --color FIND_THIS IN_FILE 

我做了一个

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

在bashrc中。

或者,您可以使用The Silver Searcher并执行操作

 ag <search> --passthrough 

如果你想用不同颜色突出几个图案,请参阅这个 bash脚本。

基本用法:

 echo warn error debug info 10 nil | colog 

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

为了在查看整个文件时突出显示图案, h可以执行此操作。

加上它使用不同的颜色为不同的模式。

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

您还可以将h的输出传送到less -R以便更好地阅读。

为每个模式grep和使用1种颜色, cxpgrep可能是一个很好的select。