Sử dụng dòng trống làm bối cảnh nhóm phân tách nhóm bối cảnh cho grep


12

Tôi cần đầu ra grep với ngữ cảnh, màu sắc và các dòng trống làm dấu tách nhóm. Trong câu hỏi này , tôi đã học cách xác định tùy chỉnh group-separatorvà tôi đã xây dựng lệnh grep của mình như thế này:

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

nhưng dấu phân cách nhóm thực sự không trống, thay vào đó nó vẫn chứa mã màu (tức là [[36m[[K[[m[[K). Điều này là do tôi đang sử dụng --color=always. Nhưng tôi cần màu trong lệnh grep của mình và tôi cần dấu phân cách là dòng trống (để xử lý thêm)

Làm thế nào tôi có thể kết hợp hai điều kiện này?


Nếu bạn có --color=alwaystrận đấu sẽ in bằng màu và nếu bạn có --group-separator=""tập hợp thành chuỗi trống, bạn sẽ nhận được một dòng trống sau nhóm phù hợp của bạn. Vui lòng thử lại --group-separator=""với chuỗi trống, không thoát màu cụ thể và sau đó giải thích những gì không hoạt động.
bsd

@bdowning đó là những gì OP đã thử. Mã mà ông đề cập không thể nhìn thấy trong đầu ra thiết bị đầu cuối. Hãy thử chuyển đầu ra qua od -cđể xem các ký tự ẩn xuất hiện trong các dòng trống.
terdon

@terdon, tôi thấy nó với od.
bsd

Câu trả lời:


9

Nếu bạn sử dụng GREP_COLORSbiến môi trường, bạn có thể kiểm soát màu sắc cụ thể cho từng loại đối sánh. man grepgiải thích việc sử dụng biến.

Lệnh sau sẽ in một trận đấu màu, nhưng không có gì trên dòng phân tách nhóm, chỉ là một dòng trống. Đường ống qua odbạn sẽ thấy lối thoát màu trước và sau trận đấu, nhưng chỉ \n\nkhi tách nhóm.

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

Việc bỏ cài đặt sethành phần sẽ ngăn chặn việc in màu trong dải phân cách nhóm.

Vì ví dụ của tôi ở trên đã sử dụng tất cả các giá trị mặc định cho GREP_COLORSsau đây cũng sẽ hoạt động.

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

Nếu bạn không sử dụng bashshell like, GREP_COLORStrước tiên bạn có thể cần xuất .


5

Cá nhân, tôi làm điều đó bằng cách sử dụng Perl, không phải grep . Tôi có một đoạn script nhỏ sẽ làm nổi bật một mẫu đã cho bằng màu:

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

Nếu bạn lưu nó trong đường dẫn của bạn như color , bạn có thể nhận được đầu ra mong muốn của mình bằng cách chạy

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

Bằng cách đó, kịch bản đang tô màu các trận đấu cho bạn và bạn có thể nói grepkhông sử dụng màu sắc và tránh vấn đề này.


Xin vui lòng, @terdon thêm nó vào một ý chính và liên kết nó trở lại đây, vì vậy sẽ dễ dàng hơn để theo dõi bất kỳ sự tiến hóa nào.
Rafareino

@Rafareino yeah, tôi sợ rằng tôi không thực sự sử dụng các công cụ như vậy. Tôi thực sự có một kho lưu trữ nhưng nó rất hiếm khi được cập nhật. Tôi giữ ý nghĩa để thiết lập một và sử dụng nó đúng cách nhưng tôi dường như không bao giờ hoàn thành nó.
terdon

Vì vậy, tôi đã thực hiện một chỉnh sửa nhỏ ngay tại đây, thật đáng buồn, tôi cần bao gồm một nhận xét để đạt được chỉnh sửa tối thiểu @terdon
Rafareino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.