我经常使用这个命令行,但我想更改“|”的颜色输出中变为绿色。有谁知道我怎样才能做到这一点?
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
会告诉打印匹配的行,一种 grep)/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"
终端功能setaf
和sgr0
中提到terminfo(5)
。