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

@bdowning कि ओपी ने क्या कोशिश की। जिस कोड का वह उल्लेख करता है वह टर्मिनल आउटपुट में दिखाई नहीं देता है। od -cरिक्त लाइनों में दिखाई देने वाले छिपे हुए वर्णों को देखने के लिए आउटपुट पास करने का प्रयास करें ।
terdon

@terdon, मैं इसे देखता हूं od
bsd

जवाबों:


9

यदि आप GREP_COLORSपर्यावरण चर का उपयोग करते हैं तो आप प्रत्येक प्रकार के मैच के लिए विशिष्ट रंगों को नियंत्रित कर सकते हैं। man grepचर के उपयोग की व्याख्या करता है।

निम्न आदेश एक रंगीन मिलान प्रिंट करेगा, लेकिन लाइन पर कुछ भी नहीं जो समूह को अलग करता है, बस एक रिक्त रेखा। के माध्यम से Piped 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

व्यक्तिगत रूप से, मैं पर्ल का उपयोग कर रहा हूं, नहीं 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 सार है, और यह यहाँ वापस लिंक, तो यह किसी भी विकास का पालन करने के आसान हो जाएगा।
रफारेनो

@ राफेरिनो हाँ, मुझे डर है कि मैं वास्तव में ऐसे टूल का उपयोग नहीं करता। मेरे पास वास्तव में एक भंडार है लेकिन यह बहुत कम ही अपडेट किया जाता है। मैं एक सेट करने और इसे ठीक से उपयोग करने के लिए अर्थ रखता हूं लेकिन मुझे कभी भी इसके लिए चक्कर नहीं लगता।
terdon

इसलिए मैंने यहीं पर एक छोटा सुधार किया, दुख की बात है, मुझे कम से कम संपादित करने के लिए एक टिप्पणी शामिल करने की आवश्यकता थी @terdon
Rafareino
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.