grep의 컨텍스트 "그룹 분리기"로 빈 줄 사용


12

컨텍스트, 색상 및 빈 줄을 그룹 구분 기호로 사용하여 grep 출력이 필요합니다. 이 질문 에서 custom을 정의하는 방법을 배웠고 다음 group-separator과 같이 grep 명령을 구성했습니다.

grep --group-separator="" --color=always -A5

그러나 그룹 구분 기호는 실제로 비어 있지 않으며 대신 여전히 색상 코드 (예 :)를 포함합니다 [[36m[[K[[m[[K. 내가 사용하고 있기 때문 --color=always입니다. 그러나 grep 명령에 색상이 필요하고 구분 기호가 빈 줄이되어야합니다 (추가 처리).

이 두 조건을 어떻게 결합 할 수 있습니까?


당신이있는 경우 --color=always컬러로 인쇄 할 경기를하고있는 경우 --group-separator=""빈 문자열로 설정을 당신은 당신의 일치하는 그룹 후에 빈 줄을 얻을 것이다. --group-separator=""특정 색상 이스케이프가 아닌 빈 문자열을 사용하여 다시 시도한 다음 작동하지 않는 것을 설명하십시오.
bsd

@bdowning은 OP가 시도한 것입니다. 그가 언급 한 코드는 터미널 출력에 표시되지 않습니다. od -c빈 줄에 나타나는 숨겨진 문자를 보려면 출력을 통과시켜보십시오 .
terdon

@terdon, 나는 그것을 본다 od.
bsd

답변:


9

GREP_COLORS환경 변수 를 사용하면 각 유형의 일치에 대한 특정 색상을 제어 할 수 있습니다. man grep변수 사용에 대해 설명합니다.

다음 명령은 색상 일치를 인쇄하지만 그룹을 구분하는 행에는 아무것도없고 빈 행만 인쇄합니다. 파이핑을 통해 od일치 전후의 색상 이탈을 볼 수 있지만 \n\n그룹 분리 에서만 가능합니다.

GREP_COLORS='ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=' grep --group-separator="" --color=always -A5

se구성 요소를 설정 해제하면 그룹 분리기에서 색상이 인쇄되지 않습니다.

위의 예 GREP_COLORS에서 다음에 대한 모든 기본값이 사용되었으므로 다음과 같이 작동합니다.

GREP_COLORS='se=' grep --group-separator="" --color=always -A5

bash유사한 쉘을 사용하지 않는 경우 GREP_COLORS먼저 내 보내야합니다.


5

개인적으로, 나는 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색상을 사용하지 말고이 문제를 피할 수 있습니다.


하는에 추가 @terdon하시기 바랍니다 요점 , 그리고 어떤 진화를 쉽게 따라갈 수 있도록, 다시 여기에 연결합니다.
Rafareino

@Rafareino 네, 그런 도구를 실제로 사용하지 않을까 걱정됩니다. 실제로 저장소가 있지만 업데이트가 거의 이루어지지 않습니다. 나는 하나를 설정하고 올바르게 사용한다는 의미를 유지하지만 결코 그것에 얽매이지 않는 것 같습니다.
terdon

내가 바로 여기 작은 수정을했다 그래서, 슬프게도, 나는 최소한의 편집 @terdon에 도달하는 주석을 포함 할 필요
Rafareino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.