如何在拖尾和tr时改变字符的颜色

如何在拖尾和tr时改变字符的颜色

我经常使用这个命令行,但我想更改“|”的颜色输出中变为绿色。有谁知道我怎样才能做到这一点?

tail -f file.log  | tr '\001' '|' | grep TEST

答案1

我认为你不能这样做,tr因为替换集被截断为匹配集的长度,并且更改颜色需要一些控制字符。

也不是不可能sed

tail -f file.log  | sed s/\001/\\x1b[32m\|\\x1b[0m/g

1b是八进制的十六进制33,经常出现在颜色提示之类的东西中,因为 shell 喜欢八进制(但要通过 获得“不可打印”的控制字符sed,请使用十六进制)。例如,只打印一个绿色条:

echo -e "\033[32m|\033[0m"

控制序列是“ANSI 转义序列”,请参阅这里详细信息(32 是绿色前景,0 是重置)。八进制 33 = 十进制 27 = ASCII 'ESC' 字符,因此是“转义序列”。

答案2

tail -f file.log  | sed -n '/TEST/s/\x1/\x1b[32m|\x1b[0m/gp'
  • -n告诉 sed 默认抑制输出(但最后p会告诉打印匹配的行,一种 gr​​ep)
  • /TEST/仅选择匹配的行(如 grep)
  • s\x1\x是十六进制值的 shell 转义)替换为\x1b[32m|\x1b[0m.
    • \x1b[开始一个ANSI 转义码
    • 32前景文本的颜色是绿色
    • \x1b[0m重置前景色
    • g对于全局,替换非常出现的情况

您可以将其设置.bashrc为函数(未测试

loggrep() {
   sed -n "/$1/s/\x1/\x1b[32m|\x1b[0m/gp"
}

答案3

我不明白你的命令如何工作,因为(至少在我的系统上)tail -f不能通过管道传输两次,因为你通过管道传输到的第二个程序(grep在你的情况下)会等到输入完成后再打印结果。

无论如何,标准方法是金发姑娘建议的,使用ANSI 转义颜色序列。由于我经常这样做,所以我编写了一个小脚本,它将为您提供的任何字符串着色:

#!/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),您可以像这样对错误日志中的行进行着色:

tr '\001' '|' < file.log | color -l "\|" 

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

答案4

要为|字符着色,请通过管道传输到

sed -e "s/\|/$(tput setaf 2)\\0$(tput sgr0)/g"

终端功能setafsgr0中提到terminfo(5)

相关内容