grepのコンテキスト「group-separator」として空行を使用する


12

コンテキスト、色、およびグループ区切りとして空白行を含むgrep出力が必要です。この質問では、customの定義方法を学びgroup-separator、次のようにgrepコマンドを作成しました。

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

しかし、グループセパレータは実際には空ではなく、代わりに色コード(つまり[[36m[[K[[m[[K)が含まれています。これは、私が使用しているためです--color=always。しかし、grepコマンドには色が必要で、セパレーターは空白行にする必要があります(さらに処理するため)

これら2つの条件をどのように組み合わせることができますか?


--color=always一致する場合は色付きで印刷--group-separator=""され、空の文字列に設定されている場合は、一致するグループの後に空白行が表示されます。--group-separator=""特定の色のエスケープではなく、空の文字列を残してもう一度やり直して、何が機能していないかを説明してください。
bsd 14

@bdowningはOPが試みたものです。彼が言及したコードは、端末出力には表示されません。出力を通過させod -cて、空白行に表示される非表示の文字を確認してください。
テルドン

@terdon、私はそれを参照してくださいod
bsd 14

回答:


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ええ、私は本当にそのようなツールを使用していないのではないかと心配しています。実際にリポジトリを持っていますが、更新されることはほとんどありません。私はそれを設定して適切に使用することを意味し続けますが、私はそれに決して近づかないようです。
テルドン

そこで、ここで小さな修正を行いました。悲しいことに、最小限の編集@terdon
Rafareino
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.