2008-10-27 10 views
19

grep --color=always का उपयोग करते समय मैं regex मैचों के लिए सुंदर रंग हाइलाइटिंग प्राप्त कर सकता हूं।रंग regex मिलान - छोड़ने के बिना

हालांकि, grep केवल कम से कम एक मैच के साथ लाइनों को लौटाता है। इसके बजाए, मैं किसी भी मैचों के बिना लाइनों को छोड़ दिए बिना, अन्य सभी इनपुट अकेले छोड़ते समय रेगेक्स मैचों को हाइलाइट करने का एक तरीका ढूंढ रहा हूं।

मैंने sed के साथ रंग काम करने की कोशिश की है, और grep दस्तावेज पढ़ा है, लेकिन मुझे लगता है कि मैं जो चाहता हूं उसे प्राप्त नहीं कर सकता।

मामले में मेरी वर्णन नहीं है स्पष्ट है, मैं चाहता हूँ:

इनपुट:

  • fred
  • टेड
  • लाल
  • नेतृत्व

Regex:

आउटपुट "* लाल।":

  • फ्रेड (लाल रंग में)
  • टेड
  • लाल (लाल रंग में)
  • नेतृत्व

तो मैं कर सकता था:

list_stuff | color_grep "make_this_stand_out_but_dont_hide_the_rest" 

संपादित करें:

मैं एक समाधान है, जो सुंदर नहीं है पाया है, लेकिन यह काम करता है:

के लिए धन्यवाद: http://www.pixelbeat.org/docs/terminal_colours/

विशेष रूप से स्क्रिप्ट (जो मैं संशोधित/सरलीकृत): http://www.pixelbeat.org/talks/iitui/sedgrep

function sedgrep() 
{ 
    C_PATT=`echo -e '\033[33;01m'` 
    C_NORM=`echo -e '\033[m'` 

    sed -s "s/$1/${C_PATT}&${C_NORM}/gi" 
} 

अभी भी ऐसा करने का एक आसान तरीका ढूंढ रहे हैं!

उत्तर

3

इस छोटे समारोह मेरी ZShell में अच्छी तरह से काम करता है:

function color_grep { 
    sed s/$1/$fg[yellow]$1$terminfo[sgr0]/g 
} 

(जरूरत

autoload colors zsh/terminfo 

)

शायद तुम कुछ इसी तरह कर सकते हैं?

संपादित करें: क्षमा करें, यह regexes के साथ काम नहीं करेगा। आपको इसे थोड़ा सा ट्विक करना होगा ...

+0

मैं बैश का उपयोग कर रहा हूं, लेकिन यह लगभग उसी प्रकार का समाधान है जैसा मैंने पोस्ट किया था। धन्यवाद! – mmocny

1

जिस तरह से आप इसे अभी कर रहे हैं, उतना ही साफ है जितना आप इसे बनाने की उम्मीद कर सकते हैं, बशर्ते कि आप अपना खुद का grep टूल लिखें। आप जरूरी उत्पादन के आदेश के संरक्षण के बारे में परवाह नहीं करते हैं, यहाँ अन्य तरह से मैं यह करने के लिए के बारे में सोच सकते हैं: के रूप में एसईडी का उपयोग कर (अधिक प्रक्रियाओं बनाया

function colormatch() 
{ 
    tee - | grep --color=always $1 | sort | uniq 
} 

के रूप में कुशल नहीं है, और टी-इंग आउटपुट), तो शायद मैं आपके sed समाधान के साथ चिपकने की सिफारिश करेंगे।

+0

अच्छा बिंदु। आपके समाधान में एक वाक्यविन्यास है जो याद रखना आसान है, उन समय के लिए जब मेरे पास मेरी .bashrc फ़ाइल आसान नहीं है :) – mmocny

2

आप g12 के लिए -C<num> विकल्प का उपयोग कर सकते हैं जो आपको <num> आपके मिलान के आसपास के संदर्भों की रेखा दिखाता है। बस सुनिश्चित करें कि <num> आपकी फ़ाइल में लाइनों की संख्या जितनी कम होगी।

+0

ओह, संदर्भ विकल्प का चतुर दुरुपयोग, मुझे यह पसंद है :-) – Jay

+1

असल में, मैंने यह कोशिश की, और यह तीन कारणों से काम नहीं करता: एक, अगर वे एक भी मैच नहीं थे, तो यह कुछ भी वापस नहीं करेगा। दो, यह धीमा था जब वास्तव में बड़ा था। तीन (सबसे बड़ी समस्या), परिणाम प्रत्येक "मैच" के साथ मुद्रित होते हैं, इसलिए यदि मैं एक पाइप पर यह आदेश चला रहा हूं तो मुझे ब्लॉब्स – mmocny

+0

में आउटपुट मिलता है, हालांकि, यह एक त्वरित हैक के रूप में ऐसा करने का एक बहुत चालाक तरीका है, खासकर के लिए छोटे परिणाम यदि आप जानते हैं कि उनका हिट है :) मैं ऐसा करता हूं जब मेरे पीसी पर नहीं – mmocny

0

मैंने हाल ही में फ़िल्टर के समान कुछ बनाया है। मैं इसे कई फाइलों के साथ पूंछ में "हेडर" रंग देने के लिए उपयोग करता हूं, जैसे:

tail -f access.log error.log foo.log | logcol.sh

हेडर इस तरह दिखेगा:

==> access.log < ==

मैं अलग लॉगफ़ाइल के बीच त्वरित परिवर्तन से उलझन में मिल गया है, तो यह logcol.sh मदद करता है। ==> विशिष्ट उपयोग के लिए हार्डकोड किया गया है लेकिन यह पैरामीटर भी हो सकता है।

#!/bin/sh 
while read line 
do 
    if test `expr "$line" : "==>.*"` -eq 0 ; 
    then 
    printf '\033[0m%s\n' "$line" 
    else 
    printf '\033[0;31m%s\n' "$line" 
    fi 
done 

शायद सबसे सुरुचिपूर्ण नहीं है लेकिन मुझे लगता है कि यह काफी पठनीय है। मुझे उम्मीद है कि मेरे पास कोई टाइपो नहीं है ;-) एचटीएच, लूट

0

मैं इस छोटी पायथन उपयोगिता खोद रहा हूं। यदि डेबियन पर नहीं है, तो आरपीएम में कनवर्ट करने के लिए विदेशी का उपयोग करें।

http://korpus.juls.savba.sk/~garabik/software/grc.html

regexp=.*red 
colours="\033[38;5;160m" 
count=once 

इस टर्मिनल रंग पर एक अच्छी पेज है।

http://www.pixelbeat.org/docs/terminal_colours/

(रानी के अंग्रेज़ी इतनी रंगीन है।)

20

सरल समाधान egrep --color=always 'text|^' जो सभी लाइन शुरुआत से मेल खाते हैं, लेकिन केवल इच्छित पाठ रंग का उपयोग करने के लिए होगा।

+3

यह मेरे लिए काम नहीं करता है, लेकिन ऐसा करता है: egrep --color = हमेशा 'text | $' मैं हूं रास्ते में zsh का उपयोग कर। – Tony

7

यहां एक स्क्रिप्ट है जिसका उपयोग मैं आउटपुट रंगीन करने के लिए करता हूं।

मुझे लगता है कि मुझे किसी प्रकार के ब्लॉग या बैश/सैड ट्यूटोरियल पर विचार/स्निपेट मिला - अब यह और नहीं मिल सकता है, यह बहुत समय पहले था।

#!/bin/bash 

red=$(tput bold;tput setaf 1)    
green=$(tput setaf 2)      
yellow=$(tput bold;tput setaf 3)   
fawn=$(tput setaf 3) 
blue=$(tput bold;tput setaf 4)   
purple=$(tput setaf 5) 
pink=$(tput bold;tput setaf 5)   
cyan=$(tput bold;tput setaf 6)   
gray=$(tput setaf 7)      
white=$(tput bold;tput setaf 7)   
normal=$(tput sgr0)      

sep=`echo -e '\001'` # use \001 as a separator instead of '/' 

while [ -n "$1" ] ; do 
    color=${!1} 
    pattern="$2" 
    shift 2 

    rules="$rules;s$sep\($pattern\)$sep$color\1$normal${sep}g" 
done 

#stdbuf -o0 -i0 sed -u -e "$rules" 
sed -u -e "$rules" 

उपयोग:

./colorize.sh color1 pattern1 color2 pattern2 ... 

उदा

dmesg | colorize.sh red '.*Hardware Error.*' red 'CPU[0-9]*: Core temperature above threshold' \ 
green 'wlan.: authenticated.*' yellow 'wlan.: deauthenticated.*' 

ओवरलैपिंग पैटर्न के साथ अच्छी तरह से काम नहीं करता है, लेकिन मुझे इसे बहुत उपयोगी पाया गया है।

एचटीएच

संबंधित मुद्दे