나는 별칭을 가지고 있습니다: 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
옵션은 모든 라인을 인쇄합니다.