grep: सभी आउटपुट प्रदर्शित करते हैं, लेकिन खोज मिलान को हाइलाइट करते हैं


43

बाश में, अगर मैं एक कमांड निष्पादित करना चाहता हूं और केवल आउटपुट लाइनें प्रदर्शित करता हूं जो एक निश्चित पैटर्न से मेल खाता है, तो मैं इसे पाइप कर सकता हूं grep, जैसे

फ़ाइल परीक्षण

hello
there
my
friends

आदेश

$ cat testfile | grep 'hello'
hello #this will be highlightd

यह सर्च मैच को हाइलाइट करेगा और उस पर पड़ने वाली पूरी लाइन को प्रदर्शित करेगा। मैं उस लाइन से पहले और बाद में लाइनों का उपयोग -Aऔर -Bप्रदर्शित कर सकता हूं । मेरा सवाल यह है कि क्या कमांड को निष्पादित करना और सभी आउटपुट को सामान्य रूप में प्रदर्शित करना संभव है, लेकिन खोज मैच को उजागर करने के लिए जैसे कि ग्रीप होगा? तो मेरा ouput होगा

hello #highlighted
there
my
friends

जवाबों:


38

केवल मिलान पैटर्न को हाइलाइट करने के लिए एक रंग GREP का उपयोग करने के लिए, लेकिन अन्यथा आउटपुट में परिवर्तन न करें:

grep --color=always -e "^" -e "hello" testfile

पहला पैटर्न सभी लाइनों से मेल खाएगा (सभी लाइनों को प्रिंट किया जाएगा) दूसरा पैटर्न (और किसी भी निम्नलिखित पैटर्न) के कारण मिलान किए गए पाठ को रंग में हाइलाइट किया जा सकता है।

चूंकि पहला पैटर्न सभी लाइनों से मेल खाता है, लेकिन प्रिंट करने योग्य चरित्र पर मेल नहीं खाता है, इसलिए यह किसी भी रंग को उजागर नहीं करता है, इसलिए यह हाइलाइट किए गए पाठ की पठनीयता के साथ प्रतिस्पर्धा / हस्तक्षेप नहीं करता है।


शून्य kubectl apply -k . | grep --color=always -e "^" -e "configured"में कुबेटेल के साथ काम करता है
माइकल कोल

बाश में उपयोग के लिए: हाइलाइट () {grep --color = always -e "^" -e $ *; }
जॉन

यह FreeBSD पर भी काम करता है, आपको बस पहले और दूसरे पैटर को स्वैप करने की "^"आवश्यकता है (दूसरे की आवश्यकता है)।
मारीआन Marierný

25

-zअपने GNU grep कमांड में विकल्प जोड़ें :

cat testfile | grep --color=always -z 'hello'

या कम है

grep --color=always -z 'hello' testfile

3
यह बहुत क्रूड हैक है। इसमें संपूर्ण फ़ाइल को एक पंक्ति के रूप में माना जाता है। इसलिए, (1) यदि फ़ाइल बहुत बड़ी है, वहाँ स्मृति से बाहर चल रहा है की संभावना है, और (2) हो सकता है अगर फ़ाइल पैटर्न शामिल नहीं है सब पर है, तो कुछ भी नहीं उत्पादन किया जाएगा।
जी-मैन ने कहा कि 'मोनिका बहाल'

इस पर grep का कौन सा संस्करण समर्थित है? 2.5.4 grep पर, -z उपलब्ध नहीं लगता है ...
एलेक्स

@ एलेक्स: मैंने GNU grep संस्करण 2.6.3 का उपयोग किया है।
सायरस

2
@ जी-मैन: अधिक संसाधन-बचत:grep --color "hello\|$" file
साइरस

@ साइरस: हाँ, यह एक बेहतर जवाब है। दुर्भाग्य से, यह अनिवार्य रूप से इस प्रश्न के bot779 के उत्तर के बराबर है , और मेरे द्वारा जुड़े प्रश्नों के स्वीकृत उत्तरों ( 1 और 2 ) के लगभग समान है।
जी-मैन का कहना है कि 'मोनिका' की बहाली

5

पिछले उत्तर के समान, आप सभी $रेखाओं को पकड़ सकते हैं:

cat testfile | grep --color -E "hello|$"

-E(या --extended-regexp) का अर्थ है कि विशेष वर्ण के साथ बच जाना चाहिए \। इसका उपयोग करते समय, |रेगेक्स "या" स्थिति के रूप में माना जाएगा।

ग्रीप |$उन सभी लाइनों को भी पकड़ और प्रिंट करेगा, जिनमें अंत है, लेकिन चूंकि $ एक छिपा हुआ पात्र है, इसलिए इसे उजागर नहीं किया जा सकता है।

अपडेट करें:

यदि आप सभी आउटपुट प्रिंट करना चाहते हैं , लेकिन एग्जिट कोड भी लौटाते हैं , तो मैच मिला या नहीं, आप पर्ल कमांड का उपयोग कर सकते हैं:

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

यदि आप sed पसंद करते हैं - यहाँ एक उदाहरण दिया गया है कि सभी मिलानों को उजागर कैसे करें + यदि कोई मैच नहीं मिला तो रिटर्न एक्जिट कोड : https://askubuntu.com/a/1200851/670392


2

यह एक GNU grep के साथ-साथ FreeBSD पर grep के साथ काम करता है:

grep --color=always 'hello\|$'

यह "हेल्लो" या ( \|) प्रत्येक लाइन के अंत में गैर-प्रिंट करने योग्य नल स्ट्रिंग से मेल खाता है ( $)। इसलिए प्रत्येक पंक्ति मुद्रित हो जाती है, लेकिन केवल "हैलो" पर प्रकाश डाला जाता है।

संभावना है कि आप पहले ही --color=autoअपने शेल में कॉन्फ़िगर कर चुके हैं । तब आपको सबसे अधिक निर्दिष्ट करने की आवश्यकता नहीं है --color=always:

grep 'hello\|$'

आप egrep(विस्तारित नियमित भावों के साथ) का उपयोग करके सरल संस्करण भी बना सकते हैं , जहाँ |"या" अभिव्यक्ति के लिए भागने की आवश्यकता नहीं है:

egrep 'hello|$'

यह जवाब नहीं देता कि सभी इनपुट लाइनों को कैसे प्रदर्शित किया जाए।
क्रिस पेज

@ क्रिसफेज मैं कहूंगा कि यह ऐसा होता है: इसीलिए प्रत्येक पंक्ति मुद्रित हो जाती है लेकिन केवल "हैलो" पर प्रकाश डाला जाता है।
मारीआन Marierný

0

ऊपर दिए गए शीर्ष उत्तर में जोड़ना। टिप्पणियों में उल्लिखित {} फ़ंक्शन केवल तभी काम करता है जब डेटा इसमें डाला जाता है। निम्नलिखित उपनाम, जबकि सही नहीं है, अधिक उपयोगी है:

alias greph="grep --color=always -e^ -e"

यह कमांड के साथ काम करता है जैसे:

greph foo bar.txt

cat bar.txt | greph foo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.