Menggunakan baris kosong sebagai konteks "pemisah-kelompok" untuk grep

12

Saya perlu keluaran grep dengan konteks, warna, dan garis kosong sebagai pemisah grup. Dalam pertanyaan ini , saya belajar cara mendefinisikan custom group-separator, dan saya telah membangun perintah grep saya seperti ini:

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

tetapi pemisah grup sebenarnya tidak kosong, malah masih berisi kode warna (yaitu [[36m[[K[[m[[K). Ini karena saya menggunakan --color=always. Tapi saya perlu warna dalam perintah grep saya, dan saya perlu separator menjadi garis kosong (untuk diproses lebih lanjut)

Bagaimana saya bisa menggabungkan kedua kondisi ini?

Martin Vegter
sumber
Jika Anda memiliki --color=alwayskecocokan akan mencetak dengan warna, dan jika Anda memiliki --group-separator=""set ke string kosong Anda akan mendapatkan garis kosong setelah grup yang cocok. Silakan coba lagi meninggalkan --group-separator=""dengan string kosong, bukan pelarian warna tertentu, dan kemudian jelaskan apa yang tidak berfungsi.
bsd
@ mengikat itulah yang dicoba OP. Kode yang disebutkannya tidak terlihat di keluaran terminal. Coba lewati keluaran od -cuntuk melihat karakter tersembunyi yang muncul di baris kosong.
terdon
@terdon, saya melihatnya od.
bsd

Jawaban:

9

Jika Anda menggunakan GREP_COLORSvariabel lingkungan, Anda dapat mengontrol warna tertentu untuk setiap jenis pencocokan. man grepmenjelaskan penggunaan variabel.

Perintah berikut akan mencetak pasangan berwarna, tetapi tidak ada pada garis yang memisahkan kelompok, hanya garis kosong. Menyalurkan melalui odAnda akan melihat warna melarikan diri sebelum dan sesudah pertandingan, tetapi hanya \n\npada pemisahan kelompok.

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

Membuka kunci sekomponen akan menekan pencetakan warna di pemisah grup.

Karena contoh saya di atas menggunakan semua nilai default untuk GREP_COLORSyang berikut ini akan berfungsi juga.

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

Jika Anda tidak menggunakan bashshell seperti, Anda mungkin perlu mengekspor GREP_COLORSdulu.

bsd
sumber
5

Secara pribadi, saya melakukan itu menggunakan Perl, bukan grep. Saya memiliki skrip kecil yang akan menyoroti pola warna tertentu:

#!/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;
}

Jika Anda menyimpannya di jalur sebagai color, Anda bisa mendapatkan hasil yang diinginkan dengan menjalankan

grep --group-separator="" --color=never -A5 foo | color -l foo

Dengan begitu, skrip mewarnai yang cocok untuk Anda dan Anda dapat mengatakan grepuntuk tidak menggunakan warna dan menghindari masalah ini.

terdon
sumber
Tolong, @terdon menambahkannya ke intisari , dan menautkannya kembali ke sini, sehingga akan lebih mudah untuk mengikuti evolusi apa pun.
Rafareino
@ Rafareino ya, saya khawatir saya tidak benar-benar menggunakan alat seperti itu. Sebenarnya saya memiliki repositori tetapi sangat jarang diperbarui. Saya tetap bermaksud mengaturnya dan menggunakannya dengan benar, tetapi sepertinya saya tidak pernah memperbaikinya.
terdon
Jadi saya membuat koreksi kecil di sini, sayangnya, saya perlu memasukkan komentar untuk mencapai edit minimum @terdon
Rafareino