रंगीन grep - हाइलाइट किए गए मैचों के साथ पूरी फ़ाइल को देखना


509

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

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

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


1
यदि आप एक से अधिक पैटर्न के लिए एक से अधिक रंग चाहते हैं (जैसे त्रुटि, चेतावनी, जानकारी, आदि संदेश), उपयोग करेंsedsedसमाधान (30 के बारे में वे वर्ण जो आप 60 के बारे में पात्रों की बजाय) जटिलता की कीमत पर आप एक से अधिक रंग हो जाता है।
ट्रेवर बॉयड स्मिथ

सीड के साथ आप एग्जिट कोड भी हाईलाइट कर सकते हैं , उदाहरण देख सकते हैं: askubuntu.com/a/1200851/670392
Noam Manos

जवाबों:


797

इसे करने के कुछ तरीके इस प्रकार हैं:

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

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

55
: आप "$" छोड़ सकते हैं egrep --color "pattern|" file(क्रेडिट stackoverflow.com/a/7398092/50979 )
13ren

15
@Zack, "|" ऑपरेटर एक OR ऑपरेटर है, न कि AND
JBoy

16
@Joy, मैं बूलियन लॉजिक तरीके के बजाय पारंपरिक अंग्रेजी तरीके से 'AND' का उपयोग कर रहा था। आप सही हैं, यह वास्तव में एक 'या' ऑपरेटर है - यह इस और उस से मेल खाता है। : पी अच्छा स्पष्टीकरण।
zslayton

12
ऐसा प्रतीत होता है कि एक पैटर्न से अधिक मिलान करने पर "$" की आवश्यकता होती है। egrep --color "pattern1|pattern2|$"। अन्यथा रंग हाइलाइटिंग नहीं होता है।
ज़ास्टर

91

यहाँ कुछ इसी तर्ज पर है। संभावना है, आप वैसे भी कम उपयोग करेंगे, इसलिए यह प्रयास करें:

less -p pattern file

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


4
साथ ही पाइपिंग (स्टेंडिंग से पढ़ना) के साथ काम करता है -:… | less -p pattern -
phk

3
@ एफके: आप डैश को छोड़ भी सकते हैं।
अगली सूचना तक रोक दिया गया।

इसके अलावा, -iविकल्प जोड़ने से मैच का मामला असंवेदनशील हो जाएगा less -ip pattern file
स्टीव जेव

... और अगर एएनएसआई-रंग के इनपुट में पाइपिंग, स्विच के lessसाथ प्रदान -Rकरें:… | less -Rip introduction -
अब्दुल

48

मैं ack की सिफारिश करना चाहूंगा - grep से बेहतर, प्रोग्रामर के लिए एक बिजली खोज उपकरण

$ ack --color --passthru --pager = "$ {PAGER: -less -R}" पैटर्न फ़ाइलें
$ ack --color --passthru पैटर्न फाइलें | कम -R
$ निर्यात ACK_PAGER_COLOR = "$ {PAGER: -less -R}"
$ ack --passthru पैटर्न फाइलें

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


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

4
@ एमपीआई ack -aसभी फ़ाइल प्रकारों को .git/ .svn/
खोजेगा

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

3
कुछ कॉन्फिग ट्विक्स के साथ, grep पहले ही सब कुछ करता है ack करता है, तेज है, और कभी-कभी ack के श्वेतसूची जैसे परिणाम कभी नहीं छोड़ता है। शायद .bashrc में अपनी पसंदीदा grep सेटिंग सहेजें। मेरा लिखा है: फ़ंक्शन जीआरपी () {GREP_OPTIONS = "- rI --color --exclude-dir = \। git --exclude = टैग" grep "$ @"
जोनाथन

22

आप मेरी highlightस्क्रिप्ट का उपयोग https://github.com/kepkin/dev-shell-essentials से कर सकते हैं

यह बेहतर है grepक्योंकि आप प्रत्येक मैच को अपने रंग से उजागर कर सकते हैं ।

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

गितुब परियोजना से स्क्रीन शॉट


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

1
यह स्क्रिप्ट अच्छी है, लेकिन उतनी अच्छी नहीं है, जितना coloutदूसरे उत्तर में बताई गई है।
जोनाथन हार्टले

@ जोनाथनहार्टले और ऐसा क्यों है? मुझे इसका कोई कारण नहीं दिखता। इसके अलावा, यह स्क्रिप्ट बहुत सरल कार्यान्वयन की तुलना में उपयोग करती है colout, जो कि यदि आप यह निरीक्षण करना चाहते हैं कि क्या अच्छा है।
हैलोगूडीबाई

@HelloGoodbye हाँ, पर्याप्त निष्पक्ष। मुझे फैसले पर रोक लगानी चाहिए। कॉलआउट अधिक गहन और शक्तिशाली है, लेकिन आप सही हैं कि यह उपयोग करने और रिवर्स-इंजीनियर के लिए संगत रूप से अधिक जटिल है।
जोनाथन हार्टले

@JonathanHartley यह समझ में आता है कि यह अधिक शक्तिशाली है!
हैलोगूडीबाई

19

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

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

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

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


अगर यह आपके सिस्टम पर उपलब्ध है तो आप भी egrep का उपयोग कर सकते हैं।
टॉम

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

5
@ --color=always--color
4p16

3
और, lessरंग कोड की व्याख्या करने के लिए , का उपयोग करें less -R
एलिया कगन

$ 2 का निर्विवाद उपयोग रिक्त सुरक्षित नहीं है। एक बैश में मैं फंक्शन ग्रीप () {लोकल पैटर्न = "$ 1" शिफ्ट एग्रेप - कलर "$ पैटर्न | ^" "$ @"} फॉर्मेटिंग मेस के लिए क्षमा करें।
रॉबर्ट क्लेमे

16

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

या फिर आप N समूहों (regex के कोष्ठक भागों) के साथ regex का उपयोग करके एक ही चीज़ को प्राप्त कर सकते हैं, उसके बाद N रंगों की अल्पविराम से अलग सूची बनाई जा सकती है।

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

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

4
@Zack ओके, सॉरी। वास्तव में, यदि आप समस्या से परे का विस्तार करते हैं grep, और यह पहले से ही उत्तर में विस्तारित है , तो आपके पास जो समस्या है , उसके coloutलिए सबसे अच्छा समाधान है, जिसके बारे में मुझे पता है। UNIX दर्शन के अनुसार, कार्यक्रमों को एक काम अच्छी तरह से करने के लिए लिखा जाना चाहिए। इसके लिए grepटेक्स्ट स्ट्रीम को फ़िल्टर करना है। इसके लिए coloutटेक्स्ट स्ट्रीम को कलर करना या हाइलाइट करना है।
user2683246

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

9

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

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

7

-zग्रेप के लिए विकल्प भी बहुत चालाक है!

cat file1 | grep -z "pattern"

यह क्या करता है? -z ASCII NUL को एक लाइन सीमांकक के रूप में उपयोग करने के लिए grep बताता है ...
vy32

6

मैंने इसे अपने .bash_aliases में जोड़ा:

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

3

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

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

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

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

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


1

ठीक है, यह एक तरीका है,

wc -l filename

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

grep -C NN --color=always filename

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

1

यहाँ एक शेल स्क्रिप्ट है जो उस टेक्स्ट को बदलने के लिए अवाक के 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]

दुर्भाग्य से, यह grep की सभी कार्यक्षमता नहीं है।

अधिक जानकारी के लिए, आप लिनक्स जर्नल में एक लेख " सो यू लाइक कलर " का उल्लेख कर सकते हैं


1

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

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

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

alias tailc = 'tail -f / my / app / log / file | आरसीजी भेज "बोल्ड GREEN" प्राप्त "CYAN" त्रुटि "RED" '


1

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

grep -A80 -B80 --color FIND_THIS IN_FILE

मैंने ए

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

bashrc में।


1
यह समस्याग्रस्त है यदि आप जिन चीज़ों की तलाश कर रहे हैं वे वहाँ नहीं हैं। एक त्रुटि के कारण कहें, जिस स्थिति में आपको कुछ नहीं मिलेगा।
पॉल रूबेल


0

यदि आप विभिन्न रंगों के साथ कई पैटर्न हाइलाइट करना चाहते हैं, तो इसे देखें बैश स्क्रिप्ट को ।

मूल उपयोग:

echo warn error debug info 10 nil | colog

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


0

मैं इसी तरह के उद्देश्य के लिए निम्नलिखित कमांड का उपयोग करता हूं:

grep -C 100 searchtext file

यह grep को हाइलाइट किए गए सर्च टेक्स्ट से पहले और बाद में संदर्भ की 100 * 2 लाइनों को प्रिंट करने के लिए कहेगा।


0

यहां मेरा दृष्टिकोण @ kepkin के समाधान से प्रेरित है:

# Adds ANSI colors to matched terms, similar to grep --color but without
# filtering unmatched lines. Example:
#   noisy_command | highlight ERROR INFO
#
# Each argument is passed into sed as a matching pattern and matches are
# colored. Multiple arguments will use separate colors.
#
# Inspired by https://stackoverflow.com/a/25357856
highlight() {
  # color cycles from 0-5, (shifted 31-36), i.e. r,g,y,b,m,c
  local color=0 patterns=()
  for term in "$@"; do
    patterns+=("$(printf 's|%s|\e[%sm\\0\e[0m|g' "${term//|/\\|}" "$(( color+31 ))")")
    color=$(( (color+1) % 6 ))
  done
  sed -f <(printf '%s\n' "${patterns[@]}")
}

यह कई तर्क स्वीकार करता है (लेकिन आपको रंगों को अनुकूलित नहीं करने देता)। उदाहरण:

$ noisy_command | highlight ERROR WARN

-1

क्या कोई तरीका है जो मुझे बता सकता है कि क्या हर मेल को पढ़ने के लिए प्रिंट किया जा सकता है, चाहे मैच हो?

विकल्प -C999सभी संदर्भ लाइनों को प्रदर्शित करने के लिए विकल्प की अनुपस्थिति में चाल करेगा। अधिकांश अन्य grep वेरिएंट भी इसका समर्थन करते हैं। हालाँकि: 1) कोई आउटपुट तब नहीं मिलता है जब कोई मैच नहीं मिलता है और 2) इस विकल्प का grep की कार्यक्षमता पर नकारात्मक प्रभाव पड़ता है: जब -Cमूल्य बड़ा होता है तो कई लाइनों को अस्थायी रूप से मेमोरी में संग्रहीत किया जा सकता है ताकि यह निर्धारित किया जा सके कि संदर्भ की कौन सी रेखा जब एक मैच होता है तब प्रदर्शित करने के लिए। ध्यान दें कि grep कार्यान्वयन इनपुट फ़ाइलों को लोड नहीं करता है, बल्कि कुछ पंक्तियों को पढ़ता है या इनपुट पर एक स्लाइडिंग विंडो का उपयोग करता है। संदर्भ के "भाग से पहले" को संदर्भ रेखाओं के बाद "माचिस" में आउटपुट करने के लिए एक विंडो (मेमोरी) में रखना होता है जब एक मैच मिलता है।

इस तरह के रूप में ^|PATTERNया इस तरह के रूप में PATTERN|$किसी भी खाली-मिलान उप-पैटर्न के लिए एक पैटर्न [^ -~]?|PATTERNएक अच्छी चाल है। हालाँकि, 1) ये पैटर्न गैर-मिलान रेखाओं को संदर्भ और 2 के रूप में हाइलाइट नहीं दिखाते हैं) यह कुछ अन्य grep विकल्पों के साथ संयोजन में उपयोग नहीं किया जा सकता है, जैसे -Fऔर-w उदाहरण के लिए।

इसलिए इनमें से कोई भी दृष्टिकोण मेरे लिए संतोषजनक नहीं है। मैं सभी गैर-मेल खाते आउटपुट को रंग-हाइलाइटेड संदर्भ लाइनों के रूप में कुशलतापूर्वक प्रदर्शित करने के लिए विकल्प के साथ ugrep , और संवर्धित grep का उपयोग कर रहा हूं -y। अन्य grep जैसे उपकरण जैसे ag और ripgrep भी पास-थ्रू विकल्प प्रदान करते हैं। लेकिन ugrep जीएनयू / बीएसडी ग्रेप और प्रस्तावों की तरह ग्रेप विकल्पों में से एक सुपरसेट के साथ संगत है -yऔर -Q। उदाहरण के लिए, यहां बताया गया है कि विकल्पों -yके साथ संयुक्त होने पर कौन-सा विकल्प दिखाता है -Q(पैटर्न में प्रवेश करने के लिए इंटरएक्टिव क्वेरी UI):

ugrep -Q -y FILE ...

एक टिप्पणी छोड़ने के बिना इसे क्यों वोट दें? वैकल्पिक grep टूल का उल्लेख करना उचित है, अन्य उत्तरों में से कुछ के समान।
डॉ। एलेक्स आरई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.