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"
使用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。