将空行用作grep的上下文“组分隔符”


12

我需要grep输出以及上下文,颜色和空白行作为组分隔符。在这个问题中,我学习了如何定义custom group-separator,并构造了grep命令,如下所示:

grep --group-separator="" --color=always -A5

但实际上组分隔符不是空的,而是仍然包含颜色代码(即[[36m[[K[[m[[K)。这是因为我正在使用--color=always。但是我的grep命令需要颜色,并且分隔符必须为空行(以供进一步处理)

如何结合这两个条件?


如果您有--color=always匹配项,则将以彩色打印,并且如果将其--group-separator=""设置为空字符串,则在匹配组之后将出现空白行。请再次尝试--group-separator=""使用空字符串(而不是特定的颜色转义符)离开,然后解释什么不起作用。
bsd 2014年

@bdowning就是OP尝试的方法。他提到的代码在终端输出中不可见。尝试使输出通过,od -c以查看出现在空白行中的隐藏字符。
terdon

@terdon,我看到了od
bsd 2014年

Answers:


9

如果使用GREP_COLORS环境变量,则可以为每种匹配类型控制特定的颜色。man grep解释了变量的用法。

下面的命令将打印一个彩色的匹配项,但是在分隔该组的行上不显示任何内容,而只是空白行。通过管道传输,od您将看到比赛前后的颜色逃逸,但仅\n\n在组分离时可见。

GREP_COLORS='ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=' grep --group-separator="" --color=always -A5

取消设置se组件将抑制组分隔符中的颜色打印。

由于上面的示例使用GREP_COLORS了以下所有默认值,因此也可以使用。

GREP_COLORS='se=' grep --group-separator="" --color=always -A5

如果您没有使用bashlike shell,则可能需要先导出GREP_COLORS


5

就个人而言,我使用Perl而不是grep。我有一个小脚本,它将以彩色突出显示给定的图案:

#!/usr/bin/env perl
use Getopt::Std;
use strict;
use Term::ANSIColor; 

my %opts;
getopts('hsc:l:',\%opts);
    if ($opts{h}){
      print<<EoF; 
DESCRIPTION

$0 will highlight the given pattern in color. 

USAGE

$0 [OPTIONS] -l PATTERN FILE

If FILE is ommitted, it reads from STDIN.

-c : comma separated list of colors
-h : print this help and exit
-l : comma separated list of search patterns (can be regular expressions)
-s : makes the search case sensitive

EoF
      exit(0);
    }

my $case_sensitive=$opts{s}||undef; 
my @color=('bold red','bold blue', 'bold yellow', 'bold green', 
           'bold magenta', 'bold cyan', 'yellow on_magenta', 
           'bright_white on_red', 'bright_yellow on_red', 'white on_black');
## user provided color
if ($opts{c}) {
   @color=split(/,/,$opts{c});
}
## read patterns
my @patterns;
if($opts{l}){
     @patterns=split(/,/,$opts{l});
}
else{
    die("Need a pattern to search for (-l)\n");
}

# Setting $| to non-zero forces a flush right away and after 
# every write or print on the currently selected output channel. 
$|=1;

while (my $line=<>) 
{ 
    for (my $c=0; $c<=$#patterns; $c++){
    if($case_sensitive){
        if($line=~/$patterns[$c]/){
           $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ge;
        }
    }
    else{
        if($line=~/$patterns[$c]/i){
          $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ige;
        }
      }
    }
    print STDOUT $line;
}

如果将其保存为color,则可以通过运行以下命令获得所需的输出

grep --group-separator="" --color=never -A5 foo | color -l foo

这样,脚本会为您为匹配项着色,您可以告诉您grep不要使用颜色并避免此问题。


请@terdon将其添加到要点中,然后将其链接回此处,这样可以更轻松地跟踪任何演变。
拉法雷诺2015年

@Rafareino是的,恐怕我并没有真正使用这样的工具。我确实有一个存储库,但是很少更新。我一直想设置并正确使用它,但我似乎从来没有回过头。
terdon

所以我在这里做了一个小小的更正,可悲的是,我需要添加评论以进行最小化编辑@terdon
Rafareino
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.