grep: 2 कीवर्ड को कैसे कलर करें?


12

मुझे पता है कि 1 कमांड का उपयोग करके 2 कीवर्ड कैसे प्राप्त करें, लेकिन मैं केवल आउटपुट में उनमें से एक को रंगने का प्रबंधन कर सकता हूं। यहाँ मेरी आज्ञा है:

grep 'keyword1' file.log | grep 'keyword2'

केवल keyword2प्रकाश डाला गया है। मैं keyword1एक ही समय में हाइलाइट कैसे कर सकता हूं ?

जवाबों:


15

grepआदेश एक को स्वीकार करता है --color=always, विकल्प तो आप उपयोग कर सकते हैं

grep 'keyword1' file.log --color=always | grep 'keyword2'

जैसा कि gertvdijk बताते हैं , यह आदेश अक्षम हो सकता है, लेकिन यह उन सभी लाइनों को खोजेगा , जिनमें keyword1 और keyword2 दोनों शामिल हैं। यदि आप उन्हें विभिन्न रंगों में उजागर करना चाहते हैं, तो आप उपयोग कर सकते हैं

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

जो नीले रंग में कीवर्ड 2 को उजागर करेगा। mtभाग का मतलब है कि grepइस का उपयोग कर मिलान पाठ पर प्रकाश डाला जाएगा सीएसआई कोड , और 01;34इसका मतलब है "सामान्य पृष्ठभूमि पर बोल्ड नीले अग्रभूमि"।


1
उपयोग के मामले के लिए विस्तृत विवरण और अनुकूलन विकल्प के लिए +1!
gertvdijk

मजेदार, जब मैं इसके साथ प्रयास करता हूं: grep -R --color = हमेशा keyword1। | grep keyword2 // केवल पहला कीवर्ड higlighted है। मैं पुनरावर्ती खोज के साथ काम करने के लिए आपके उत्तर को कैसे अनुकूलित कर सकता हूं?
10LeftFingers

1
यह अजीब है, grep -R --color=always keyword1 . | grep keyword2काम करना चाहिए। क्या आप फिर से आउटपुट को रीडायरेक्ट कर रहे हैं (जैसे कि दूसरी पाइपिंग grepकरके less -R)? यदि हां, तो आपको --color=alwaysदूसरे को भी जोड़ना होगा ।
डैनियल एच

बहुत बढ़िया जवाब! दोनों को उजागर --color=autoकरने के लिए grep, बस के बाद दूसरे के लिए आवश्यक होगा 'keyword2'
लुइस

@Luis हाँ, आप सही कह रहे हैं कि Grep कम से कम अक्सर बिना किसी रंग के डिफॉल्ट करता है (हालाँकि यह एक कॉन्फ़िगर-टाइम विकल्प हो सकता है; मुझे नहीं लगता कि मैंने 2013 में इसे ओवरराइड किया था जब इसके बिना मेरी मशीन पर काम किया था)। मैंने --color=alwaysजवाब में जोड़ा , क्योंकि आप इसे lessया कुछ को भी पाइप करना चाह सकते हैं ।
डैनियल एच

3

उदाहरण के लिए grep, पाइपिंग के बजाय वास्तविक नियमित अभिव्यक्ति आज़माएं :

grep -E "\<foo\>.*\<bar\>" file

यह उन मेल लाइनों तक सीमित है जिसमें यह कीवर्ड केवल इसी क्रम में मेल खाते हैं, दुर्भाग्य से। वैसे भी, grepआपके प्रश्न का उपयोग अक्षम है और आपको इससे बचना चाहिए। @DanielH का जवाब शायद आपके मामले के लिए काफी अधिक सरल है।

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

grep -E "(foo|bar)" file

1
मुझे लगता है कि ओपी केवल ऐसी लाइनें चाहता है जिसमें दोनों कीवर्ड होते हैं (आपके द्वारा दी गई कमांड उन सभी लाइनों को देती है जिनमें दोनों में से एक होता है)।
डैनियल एच

@DanielH कि बाहर इशारा करने के लिए धन्यवाद। मैंने अपना उत्तर अपडेट कर दिया है।
gertvdijk

क्या यह अभी भी केवल काम करता है अगर फू बार से पहले आता है? मुझे नहीं पता foo.*bar|bar.*fooकि क्या इस मामले के लिए कोई बेहतर तरीका है , या यदि यह इस मामले के लिए भी आवश्यक है (जो कि एक लॉग फ़ाइल प्रतीत होती है, जो शायद कीवर्ड के लिए एक मानक आदेश होगा)। इससे पहले कि आप अपना अपडेट दें, मैंने अपना जवाब जोड़ दिया, लेकिन मैं इसे इधर-उधर रखूंगा कि ऐसी स्थिति में जहां जंजीर grepवास्तव में आवश्यक हो (या किसी अन्य समय रंगीन आउटपुट को टर्मिनल पर नहीं भेजा जाना चाहिए, जैसे grep | less -R)।
डैनियल एच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.