후행 및 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

1b8진수의 16진수 버전이며 33쉘이 8진수를 좋아하기 때문에 색상 힌트와 같은 항목에 자주 나타납니다(그러나 "인쇄할 수 없는" 제어 문자를 얻으려면 sed16진수를 사용하십시오). 예를 들어 녹색 막대만 인쇄하려면 다음을 수행하세요.

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"

터미널 기능 setafsgr0에 언급되어 있습니다 terminfo(5).

관련 정보