2009-06-11 13 views
353

मुझे grep का --color=always झंडा जबरदस्त उपयोगी लगता है। हालांकि, grep केवल मैचों के साथ लाइनों को प्रिंट करता है (जब तक आप संदर्भ रेखाओं के लिए नहीं पूछते)। यह देखते हुए कि प्रत्येक पंक्ति में प्रिंट करने के लिए एक मैच होता है, हाइलाइटिंग उतनी क्षमता को जोड़ती नहीं है जितनी यह हो सकती है।रंगीन grep - हाइलाइट किए गए मैचों के साथ पूरी फ़ाइल को देखकर

मुझे वास्तव में cat एक फ़ाइल चाहिए और पूरी फ़ाइल को हाइलाइट किए गए पैटर्न मैचों के साथ देखें।

क्या कोई तरीका है कि मैं किसी भी मैच को पढ़ने के बावजूद पढ़ने के लिए हर पंक्ति को मुद्रित करने के लिए grep बता सकता हूं? मुझे पता है कि मैं फ़ाइल की हर पंक्ति पर grep चलाने के लिए एक स्क्रिप्ट लिख सकता हूं, लेकिन मैं उत्सुक था कि यह मानक grep के साथ संभव था।

उत्तर

567

कर सकते हैं यहाँ यह करने के लिए कुछ तरीके हैं:

grep --color -E 'pattern|$' file 
grep --color 'pattern\|$' file 
egrep --color 'pattern|$' file 
+117

वह | $ चाल साफ है! ठीक है, मुझे याद रखना होगा। आप में से उन लोगों के लिए जो नियमित अभिव्यक्ति समझदार नहीं हैं, "पैटर्न | $" उन पंक्तियों से मेल खाएगा जिनके लिए आप खोज रहे हैं और जिन रेखाओं का अंत है - यानी, वे सभी हैं। चूंकि रेखा का अंत वास्तव में कोई वर्ण नहीं है, इसलिए आउटपुट का रंगीन भाग आपका पैटर्न होगा। धन्यवाद रयान! – zslayton

+40

आप "$" को भी छोड़ सकते हैं: 'egrep --color "pattern |" फ़ाइल' (क्रेडिट http://stackoverflow.com/a/7398092/50979) – 13ren

+10

@ ज़ैक, "|" ऑपरेटर एक ओआर ऑपरेटर है, न कि एक और, – JBoy

1

ठीक है, इस

wc -l filename 

आप लाइन गिनती दे देंगे एक ही रास्ता है, - कहते हैं कि एनएन, तो आप

grep -C NN --color=always filename 
+2

"-C 2147483647" अगर आप पहले wc नहीं करना चाहते हैं। यहां बड़ी संख्या का उपयोग करना चीजों को धीमा करने के लिए प्रकट नहीं होता है। – barrycarter

1

यहां एक शेल स्क्रिप्ट है जो आपके द्वारा खोजे जा रहे पाठ को प्रतिस्थापित करने के लिए Awk के gsub फ़ंक्शन का उपयोग करती है, जिसे आप बी में प्रदर्शित करने के लिए उचित भागने अनुक्रम के साथ खोज रहे हैं। सही लाल:

#! /bin/bash 
awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2 

इतना है कि यह प्रयोग करें:

$ ./cgrep pattern [file] 

दुर्भाग्य से, यह ग्रेप के सभी सुविधा उपलब्ध नहीं है।

अधिक जानकारी के लिए आप यहाँ उसी तर्ज पर कुछ एक लेख "So You Like Color" लिनक्स जर्नल

62

में देख सकते हैं। संभावना है कि, आप कम वैसे भी का उपयोग कर जाएगा, तो यह प्रयास करें:

less -p pattern file 

यह पैटर्न को उजागर करने और फाइल में यह पहली घटना पर चला जाएगा।

+1

'-':' ... का उपयोग करके पाइपिंग (स्टडींग से पढ़ना) के साथ भी काम करता है। कम-पैटर्न- – phk

+1

@ एफके: आप डैश को भी छोड़ सकते हैं। –

38

मैं ack -- better than grep, a power search tool for programmers की सिफारिश करना चाहता हूं।

 
$ ack --color --passthru --pager="${PAGER:-less -R}" pattern files 
 
$ ack --color --passthru pattern files | less -R 
 
$ export ACK_PAGER_COLOR="${PAGER:-less -R}" 
$ ack --passthru pattern files 

मैं इसे प्यार करता है क्योंकि यह निर्देशिका के पुनरावर्ती खोज करने के लिए डिफ़ॉल्ट (और इसलिए grep -r अधिक चालाक ज्यादा करता है), पूर्ण पर्ल नियमित अभिव्यक्ति का समर्थन करता है (बजाय POSIXish regex(3)), और एक है कई फाइलों को खोजते समय बहुत अच्छा संदर्भ प्रदर्शित होता है।

+1

हालांकि, समय-समय पर, मुझे यह नहीं लगता कि मैं क्या चाहता हूं जब मुझे यकीन है कि यह वहां होना चाहिए। 'एएके' स्मार्ट है, लेकिन कभी-कभी बहुत स्मार्ट है, और यह उस फ़ाइल प्रकार से निकलता है जिसमें हिट था। –

+4

@MPi 'ack -a' सभी फ़ाइल प्रकारों को खोजेगा, जबकि अभी भी' .git/''svn /' को छोड़कर आदि – ephemient

+1

हालांकि, यह अच्छा है कि 'एके' मेरी छवियों के माध्यम से नहीं खोजता है, इसलिए '-a' बहुत अधिक करता है। मैंने एक उदाहरण देने के लिए ''type-set = freemarker = .ftl' को अपने' ~/.ackrc' में जोड़ा। –

5

मैं "लिनक्स सर्वर हैक्स", O'Reilly से आरसीजी का उपयोग करता हूं। यह आप जो चाहते हैं उसके लिए यह सही है और अलग-अलग रंगों के साथ प्रत्येक अभिव्यक्ति को हाइलाइट कर सकता है।

#!/usr/bin/perl -w 
# 
#  regexp coloured glasses - from Linux Server Hacks from O'Reilly 
# 
#  eg .rcg "fatal" "BOLD . YELLOW . ON_WHITE" /var/adm/messages 
# 
use strict; 
use Term::ANSIColor qw(:constants); 

my %target = (); 

while (my $arg = shift) { 
     my $clr = shift; 

     if (($arg =~ /^-/) | !$clr) { 
       print "Usage: rcg [regex] [color] [regex] [color] ...\n"; 
       exit(2); 
     } 

     # 
     # Ugly, lazy, pathetic hack here. [Unquote] 
     # 
     $target{$arg} = eval($clr); 

} 

my $rst = RESET; 

while(<>) { 
     foreach my $x (keys(%target)) { 
       s/($x)/$target{$x}$1$rst/g; 
     } 
     print 
} 
+4

आपका स्वरूपण खराब हो गया है, दोस्त। (मैं इसे स्वयं ठीक कर दूंगा, लेकिन स्टैक ओवरफ्लो की आत्म-धार्मिक और elitist प्रतिष्ठा प्रणाली के कारण, मुझे अनुमति नहीं है।) –

+1

बस स्वरूपण को ठीक किया गया। – dave1010

1

एक अन्य उत्तर में grep के -C स्विच का उल्लेख किया गया जिसमें संदर्भ की एन पंक्तियां शामिल हैं। मैं कभी-कभी एन = 99 के साथ ऐसा करता हूं [कम से कम] संदर्भ के एक स्क्रीनफुल को प्राप्त करने के त्वरित और गंदे तरीके के रूप में जब egrep पैटर्न बहुत खराब लगता है, या जब मैं उस मशीन पर हूं जिस पर मैंने आरसीजी स्थापित नहीं किया है और/या ccze।

मैंने हाल ही में ccze की खोज की जो एक अधिक शक्तिशाली रंगीन यंत्र है। मेरी एकमात्र शिकायत यह है कि यह स्क्रीन उन्मुख है (जैसे less, जिसे मैं कभी भी उस कारण से उपयोग नहीं करता) जब तक कि आप "कच्चे एएनएसआई" आउटपुट के लिए एए स्विच निर्दिष्ट नहीं करते हैं।

+1 rcg के लिए ऊपर उल्लिखित है। यह अभी भी मेरा पसंदीदा है क्योंकि यह उपनाम में अनुकूलित करना इतना आसान है। ऐसा कुछ आमतौर पर मेरे ~/.bashrc में होता है:

ऊर्फ tailc = 'tail -f/my/app/log/file | RCG "बोल्ड हरे" प्राप्त "सियान" त्रुटि "लाल" भेजें '

0

एक और गंदा तरीका:

grep -A80 -B80 --color FIND_THIS IN_FILE 

मैं bashrc में एक

alias grepa='grep -A80 -B80 --color' 

किया था।

+0

यह समस्याग्रस्त है यदि आप जो चीजें खोज रहे हैं वह वहां नहीं है। किसी त्रुटि के कारण कहें, इस मामले में आपको कुछ भी नहीं मिलेगा। –

14

आप एक उपनाम भी बना सकते हैं। अपने .bashrc में इस समारोह जोड़ें (या OSX पर .bash_profile)

function grepe { 
    grep --color -E "$1|$" $2 
} 

अब आप इस तरह अन्य नाम का उपयोग कर सकते हैं: "ifconfig | grepe inet" या "grepe css index.html"।

(पुनश्च: वर्तमान सत्र पर bashrc फिर से लोड करने source ~/.bashrc को भूल नहीं है)

+0

यदि आप अपने सिस्टम पर उपलब्ध हैं तो आप केवल egrep का उपयोग कर सकते हैं। – Tom

+1

इसके परिणाम को कम करने से रंग की जानकारी कम हो जाती है। आप इसे कैसे रोकेंगे? –

+3

@Hoten '--color' –

14

आप क्योंकि आप के साथ हर मैच के हाइलाइट कर सकते हैं यह बेहतरgrep से है https://github.com/kepkin/dev-shell-essentials

से मेरी highlight स्क्रिप्ट का उपयोग कर सकते हैं अपने स्वयं का रंग

$ command_here | highlight green "input" | highlight red "output" 

Screen shot from Github project

+3

प्रश्न ने स्पष्ट रूप से 'grep' का उपयोग करके समाधान के लिए पूछा, जो कि चलने वाली मशीनों पर मानक उपयोगिता है * निक्स। – zslayton

+4

यहां 12 उत्तरों में से मुझे लगता है कि केवल 5 इस्तेमाल किए गए grep – mchid

+1

यह स्क्रिप्ट अच्छी है, लेकिन किसी अन्य उत्तर में उल्लिखित 'कोलाउट' जितना अच्छा नहीं है। –

1

मैं अपने .bash_aliases को यह कहा:

highlight() { 
    grep --color -E "$1|\$" 
} 
9

उपयोग colout कार्यक्रम: http://nojhan.github.io/colout/

यह एक पाठ धारा में रंग डाला जोड़ने के लिए बनाया गया है। एक रेगेक्स और रंग (उदा। "लाल") को देखते हुए, यह हाइलाइट किए गए मैचों के साथ एक टेक्स्ट स्ट्रीम को पुन: उत्पन्न करता है। उदाहरण के लिए:

# cat logfile but highlight instances of 'ERROR' in red 
colout ERROR red <logfile 

आप श्रृंखला कई आमंत्रण को जोड़ने के लिए कर सकते हैं कई अलग रंग पर प्रकाश डाला:

tail -f /var/log/nginx/access.log | \ 
    colout ' 5\d\d ' red | \ 
    colout ' 4\d\d ' yellow | \ 
    colout ' 3\d\d ' cyan | \ 
    colout ' 2\d\d ' green 

या आप एन समूहों के साथ एक regex का उपयोग करके एक ही बात को प्राप्त कर सकते (regex के parenthesised भागों), एन रंगों की एक अल्पविराम से अलग सूची के बाद।

vagrant status | \ 
    colout \ 
     '\''(^.+ running)|(^.+suspended)|(^.+not running)'\'' \ 
     green,yellow,red 
+1

जैसा कि कहीं और बताया गया है, सवाल ने स्पष्ट रूप से grep का उपयोग करके समाधान के लिए कहा, जो कि * nix चल रही मशीनों पर एक मानक उपयोगिता है। – zslayton

+2

@Zack ठीक है, क्षमा करें। दरअसल, यदि आप 'grep' से परे समस्या का विस्तार करते हैं, और यह पहले से ही उत्तर में विस्तारित है, तो आपके पास मौजूद समस्या के लिए' कोलाउट 'सबसे अच्छा समाधान है, जो मुझे पता है। यूनिक्स दर्शन के अनुसार, कार्यक्रमों को अच्छी तरह से एक काम करने के लिए लिखा जाना चाहिए। 'Grep' के लिए यह टेक्स्ट स्ट्रीम फ़िल्टर कर रहा है। 'कोलाउट' के लिए यह टेक्स्ट स्ट्रीम को रंगना या हाइलाइट करना है। – user2683246

+0

यह सबसे अच्छा जवाब है, क्योंकि यह कई अलग-अलग रंगीन हाइलाइट्स लागू कर सकता है, और 'कोलाउट' इतना व्यापक रूप से उपयोगी टूल है। इसे एक बार सीखें, लॉगफाइल को हाइलाइट करने के लिए एक टूल सीखने के बजाय, परीक्षण आउटपुट को हाइलाइट करने के लिए, अन्य स्थितियों में इसका उपयोग करें। –

0

वैकल्पिक रूप से आप The Silver Searcher का उपयोग करें और

ag <search> --passthrough 
0

कर आप कई पैटर्न पर प्रकाश डाला अलग अलग रंग के साथ this बैश स्क्रिप्ट देखना चाहते हैं कर सकते हैं।

बेसिक उपयोग:

echo warn error debug info 10 nil | colog 

आप पैटर्न और रंग बदल जबकि एक कुंजी दबाने चल रहा है और उसके बाद कुंजी दर्ज कर सकते हैं।

0

संपूर्ण फ़ाइल को देखते हुए पैटर्न को हाइलाइट करने के लिए, h ऐसा कर सकता है।

प्लस यह विभिन्न पैटर्न के लिए विभिन्न रंगों का उपयोग करता है।

cat FILE | h 'PAT1' 'PAT2' ... 

भी कर सकते हैं पाइप बेहतर पढ़ने के लिए less -R को h के उत्पादन।

प्रत्येक पैटर्न के लिए 1 रंग grep और उपयोग करने के लिए, cxpgrep एक अच्छा फिट हो सकता है।

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