ส่วนตัวผมทำอย่างนั้นโดยใช้ 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
ได้ว่าไม่ต้องใช้สีและหลีกเลี่ยงปัญหานี้
--color=always
การจับคู่จะพิมพ์ด้วยสีและถ้าคุณมีการ--group-separator=""
ตั้งค่าเป็นสตริงว่างคุณจะได้รับบรรทัดว่างหลังจากกลุ่มการจับคู่ของคุณ โปรดลองอีกครั้งโดยปล่อย--group-separator=""
สตริงว่างเปล่าไม่ใช่เส้นแบ่งสีที่เฉพาะเจาะจงแล้วอธิบายว่าอะไรไม่ทำงาน