การใช้บรรทัดว่างเป็นบริบท“ group-separator” สำหรับ grep


12

ฉันต้องการเอาต์พุต grep ที่มีบริบทสีและบรรทัดว่างเป็นตัวคั่นกลุ่ม ในคำถามนี้ฉันเรียนรู้วิธีการกำหนดแบบกำหนดเองgroup-separatorและฉันได้สร้างคำสั่ง grep ของฉันเช่นนี้:

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

แต่ตัวแยกกลุ่มไม่ได้ว่างเปล่า แต่ก็ยังมีรหัสสี (เช่น[[36m[[K[[m[[K) --color=alwaysนี้เป็นเพราะฉันใช้ แต่ฉันต้องการสีในคำสั่ง grep ของฉันและฉันต้องการตัวคั่นเป็นบรรทัดว่าง (สำหรับการประมวลผลเพิ่มเติม)

ฉันจะรวมสองเงื่อนไขนี้ได้อย่างไร


หากคุณมี--color=alwaysการจับคู่จะพิมพ์ด้วยสีและถ้าคุณมีการ--group-separator=""ตั้งค่าเป็นสตริงว่างคุณจะได้รับบรรทัดว่างหลังจากกลุ่มการจับคู่ของคุณ โปรดลองอีกครั้งโดยปล่อย--group-separator=""สตริงว่างเปล่าไม่ใช่เส้นแบ่งสีที่เฉพาะเจาะจงแล้วอธิบายว่าอะไรไม่ทำงาน
bsd

@ การบีบอัดนั่นคือสิ่งที่ 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.