颜色匹配但也打印其他线条

颜色匹配但也打印其他线条

我有一个别名:alias grep='grep --color=auto'.我希望有某种方法不仅可以打印匹配的行,而且可以打印所有的行以及颜色匹配的图案。我怀疑是否有一个选择本身可以做到这一点grep。还有其他工具吗?或者想法如何实现这一目标?

答案1

你可以使用-E选项来实现这个技巧:

grep -E '(^|pattern)' file

这是一个简单的输出:

在此输入图像描述

答案2

你可以使用一点sed终端魔法来做到这一点:

$ sed -e 's/<pattern>/\x1b[31;01m&\x1b[m/g' <file>

这会将每个出现的 替换为由(这是“将前景色设置为粗体红色”的终端转义序列)和(与“将前景色设置为默认值”相同)<pattern>包围的匹配文本。\x1b[31;01m\x1b[m

答案3

我编写了一个小脚本,它将为您提供的任何字符串着色:

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

my %opts;
getopts('hic:l:',\%opts);
    if ($opts{h}){
      print<<EoF; 
Use -l to specify the pattern(s) to highlight. To specify more than one 
pattern use commas. 

-l : A Perl regular expression to be colored. Multiple expressions can be
     passed as comma separated values: -l foo,bar,baz
-i : makes the search case sensitive
-c : comma separated list of colors;

EoF
      exit(0);
    }

my $case_sensitive=$opts{i}||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');
if ($opts{c}) {
   @color=split(/,/,$opts{c});
}
my @patterns;
if($opts{l}){
     @patterns=split(/,/,$opts{l});
}
else{
    $patterns[0]='\*';
}

# 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在您的目录中$PATH并使其可执行(chmod +x /usr/bin/color),则可以为匹配的模式着色,如下所示:

echo -e "foo\nbar\nbaz\nbib" | color -l foo,bib 

这将产生:

  在此输入图像描述

正如所写的,该脚本为 10 种不同的图案预定义了颜色,因此如上例所示,给它一个逗号分隔的列表,将为每个匹配的图案着色不同的颜色。

答案4

这是内置于确认-- 彩色输出是默认值,该--passthru选项打印所有行。

相关内容