我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。
我真的想猫一个文件,并看到整个文件与模式匹配突出显示。
是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。
我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。
我真的想猫一个文件,并看到整个文件与模式匹配突出显示。
是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。
当前回答
这里有一些类似的东西。很有可能,无论如何你都会用得更少,所以试试这个:
less -p pattern file
它将突出显示该模式,并跳转到该模式在文件中第一次出现的位置。
你可以用n跳到下一个出现点,用p跳到前一个出现点,用q退出。
其他回答
你可以从https://github.com/kepkin/dev-shell-essentials上使用我的高亮脚本
它比grep更好,因为您可以用自己的颜色突出显示每个匹配。
$ command_here | highlight green "input" | highlight red "output"
我使用的rcg来自“Linux服务器黑客”,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
}
我想推荐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正则表达式(3)),并且在搜索许多文件时具有更好的上下文显示。
我把这个添加到我的.bash_aliases中:
highlight() {
grep --color -E "$1|\$"
}
正如grep -E '|pattern'已经被建议的那样,只是想澄清一下,它也可以突出显示整行。
例如:tail -f somelog | grep——color -E '| \[2\]。*'(特别是-E '|部分):