我发现grep的--color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。考虑到它打印的每一行都有一个匹配项,突出显示并没有增加尽可能多的功能。
我真的想用cat一个文件来查看整个文件,并突出显示模式匹配。
有什么方法可以让grep打印每一行正在阅读的内容,不管是否有匹配的内容?我知道我可以编写一个脚本来在文件的每一行上运行grep,但是我很好奇标准的grep是否可以这样做。
- 如果您需要多个颜色用于多个图案(即错误、警告、信息等信息),请使用sed。sed解决方案以增加复杂性为代价为您提供多种颜色(而不是大约30个字符,您有大约60个字符)。
以下是一些方法:
1 2 3
| grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file |
- 那美元的把戏真漂亮!干得好,我得记住这一点。对于那些不懂正则表达式的人,"pattern$"将匹配具有您要搜索的模式的行和具有结尾的行——也就是说,所有这些行。因为行尾实际上不是任何字符,所以输出的彩色部分将只是您的模式。谢谢瑞安!
- 您还可以省略"$":egrep --color"pattern|" file(credit stackoverflow.com/a/7398092/50979)
- @扎克,""运算符是"或"运算符,而不是"和",
- @jboy,我用的是传统的英语方式而不是布尔逻辑方式。您是对的,它实际上是一个"或"运算符——它与这个和那个匹配。:p很好的澄清。
- 如果匹配多个模式,则似乎需要"$"。egrep --color"pattern1|pattern2|$"。否则不会出现颜色突出显示。
- 如果不使用"",则不必使用-e标志(扩展正则表达式),例如:grep --color"pattern\|$" file。
- 对于Regex定向引擎(如OS X Mountain Lion和Mavericks上的grep),需要"$"。
- 那很有用,谢谢你的小费
- 您甚至不必使用扩展的regex标志(-e),默认情况下,如果管道被转义,基本regex可以匹配多个模式。所以这对我很有效:grep 'pattern\|'。
- 如果您打算将其导入less,并且仍然希望输出着色,那么您可能希望使用grep--color=always和alias less='less-r'
- @qwertyboy是GNU grep的一个特征。与posix兼容的grep(不是:egrep)只支持基本正则表达式(bres),而不支持-e,在这种情况下不可能改变。(您应该始终使用egrep而不是grep -E,以确保您可以使用扩展正则表达式(eres)。grep的实现不同。)
- @qwertyboy -e与-e不同。-e将以下位置参数标记为正则表达式(以便它可以以-开头,但仍不被视为选项);-e另外启用了ere支持。请参见posix grep规范。
- 我们能用不同的颜色来配不同的火柴吗--白鹭--颜色"图案1图案2|$
- 这对"实况"输出有效吗?我想通过管道将测试应用程序中的活动日志着色为grep实例。
- 我喜欢这种回答。谢谢您。
- 很多年前,grep -E比egrep更受欢迎。答案似乎是相反的。
- 我仍然会使用--color=always,而不仅仅是--color,因为当您将grep发送到另一个命令(例如less -R)时,后者不会保留着色。
- 为我工作过:grep -e pattern -e$ --color file。
- @13ren grep有一些变体可以优化掉"",因此"pattern$"更好(请参阅stackoverflow.com/a/13979036/939457)。
这是同一条线的东西。很有可能,你会用的更少,所以试试这个:
它将突出显示该模式,并跳转到文件中第一个出现的模式。
- 也可以使用-:… | less -p pattern -来处理管道(从标准中读取)。
- @你甚至可以省略破折号。
- 此外,添加-i选项将使匹配不区分大小写,如less -ip pattern file中所示。
- …如果管道为ANSI彩色输入,则向less提供-R开关:… | less -Rip introduction -。
我想推荐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)),并且在搜索许多文件时具有更好的上下文显示。
- 然而,有时,当我确信它一定在那里时,它找不到我想要的东西。ack很聪明,但有时太聪明,它排除了命中的文件类型。
- 将搜索到的文件ack -a@ MPI的类型,同时还excluding .git/.svn/等。
- 不管一个人多,ackdoes not that is Cool /搜索图像通过我的-adoes,知道的太多了。我的--type-set=freemarker=.ftladded to ~/.ackrc,给一个实例。
- 与一些配置tweaks grep的一切,已经快到does is never does,结果,和omits有时ack' S类白名单给你。也许你preferred settings中保存.bashrc. grep地雷:GRP()函数读取数= {"grep _期权-彩色-迪尔拒绝-拒绝= = 0 - .git标签"grep"$""
也可以创建别名。在.bashrc(或osx上的.bash_配置文件)中添加此函数
1 2 3
| function grepe {
grep --color -E"$1|$" $2
} |
您现在可以使用这样的别名:"ifconfig | grepe inet"或"grepe css index.html"。
(附言:别忘了让source ~/.bashrc在当前会话中重新加载bashrc)
- 你也可以只使用它的使用egrep if available on你的系统。
- the result of this to less管道loses the彩色信息。伙伴,你会如何?
- 使用--color=alwaysinstead of --color@华天
- 和解释,让lessthe彩色编码,使用less -R。
- unquoted of the is not空白2美元的使用安全。我宁愿在我grepe bash local function(){ ="1美元"模式——"移egrep彩色模式"|美元美元为"@"} for the formatting对不起混乱。
你可以从https://github.com/kepkin/dev-shell-essentials使用我的highlight脚本
它比grep好,因为你可以用自己的颜色突出显示每一个匹配项。
1
| $ command_here | highlight green"input" | highlight red"output" |
- 要解决的问题expressly for which is a grep使用标准工具,在线*nix机器运行。
- 这个脚本是好的,but not as good as colout在上述另一个答案。
- jonathanhartley is that"和为什么知道?看到不reason for it.besides,这比简单的内部执行脚本uses多coloutwhich是好的,如果你想要什么inspect does。
- "是的hellogoodbye,公平不够的。hold on the判断应该关闭。更多的颜色和powerful thorough is,but You are right to that is correspondingly桑恩复合使用和反向工程师。
- "恩,让jonathanhartley感恩是powerful黑莓!
使用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 |
- 当我问的问题noted elsewhere,expressly for a solution使用grep,which is a标准机器运行在*nix的效用。
- "扎克好,对不起。其实,如果你的问题grepEXPAND Beyond the en is already和扩大,在the answers,coloutsolution is the Best for the你有问题,我大学最好的感知。根据UNIX哲学should be written to do,项目的一个好东西。grepen is for过滤文本流。colouten is for highlighting上色或文本流。
- 最佳答案because this is the can apply,恩多不同色和高光,coloutis useful tool -这样的发散。学习使用EN EN盎司,比在许多情况,学习一个tool to"亮点亮点一测试输出到日志文件,等等。
我使用来自"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" |
好吧,这是一条路,
会给你行数——比如说nn,你就可以了
1
| grep -C NN --color=always filename |
- "-C 2147483647"如果您不想先上厕所。在这里使用大量的数字似乎不会减慢速度。
另一个答案提到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中。
- problematic if this is looking for the things there你不是国王。说两个房子在which to an error,你会得到什么。
或者你可以使用银搜索器
1
| ag <search> --passthrough |
如果您想突出显示几个不同颜色的图案,请参阅这个bash脚本。
基本用法:
1
| echo warn error debug info 10 nil | colog |
您可以在按一个键然后按Enter键的同时更改图案和颜色。
我将以下命令用于类似目的:
grep -C 100 searchtext file
这将表示grep在突出显示的搜索文本前后打印100*2行上下文。