나는 이 명령줄을 정기적으로 사용하지만 출력의 "|" 색상을 녹색으로 변경하고 싶습니다. 내가 어떻게 할 수 있는지 아는 사람 있나요?
tail -f file.log | tr '\001' '|' | grep TEST
답변1
tr
대체 세트가 일치 세트의 길이로 잘리고 색상을 변경하려면 일부 제어 문자가 필요하기 때문에 이렇게 할 수 없을 것 같습니다 .
불가능하지도 않습니다 sed
.
tail -f file.log | sed s/\001/\\x1b[32m\|\\x1b[0m/g
1b
8진수의 16진수 버전이며 33
쉘이 8진수를 좋아하기 때문에 색상 힌트와 같은 항목에 자주 나타납니다(그러나 "인쇄할 수 없는" 제어 문자를 얻으려면 sed
16진수를 사용하십시오). 예를 들어 녹색 막대만 인쇄하려면 다음을 수행하세요.
echo -e "\033[32m|\033[0m"
제어 시퀀스는 "ANSI 이스케이프 시퀀스"입니다.여기세부 정보(32는 녹색 전경, 0은 재설정됨) 8진수 33 = 10진수 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
는 16진수 값의 쉘 이스케이프임) 을\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
.
어쨌든 표준 접근 방식은 Goldilocks가 제안한 대로 다음을 사용합니다.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)
.