ग्रीप से कम तक पाइप का उपयोग करते समय रंगीन परिणाम प्राप्त करना


246

मैं grep के --colour विकल्प का बहुत उपयोग करता हूं, लेकिन मैं अक्सर भी कम उपयोग करता हूं। मैं grep को कैसे कम कर सकता हूं और फिर भी रंग को संरक्षित कर सकता हूं। (या यह संभव है?)

grep "search-string" -R * --colour | less 

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

मैं एक प्रत्यक्ष समाधान या इसके बराबर कुछ भी ढूंढ रहा हूं।



क्या करता *है? Grep के मैन पेज से: *: The preceding item will be matched zero or more times.लेकिन मुझे अभी भी समझ नहीं आया है ..! @ जेरेमी पॉवेल
शायन

जवाबों:


274

जब आप बस चलाते हैं तो grep --colorयह निकलता है grep --color=autoजो पता लगाता है कि क्या आउटपुट एक टर्मिनल है और यदि ऐसा है तो रंगों को सक्षम बनाता है। हालांकि, जब यह एक पाइप का पता लगाता है तो यह रंग को निष्क्रिय कर देता है। निम्नलिखित आदेश:

grep --color=always -R "search string" * | less

हमेशा रंग को सक्षम करेगा और स्वचालित पहचान को ओवरराइड करेगा, और आपको रंग हाइलाइटिंग में मिलेगा less

संपादित करें: हालांकि lessमेरे लिए सिर्फ काम करता है, शायद पुराने संस्करण -Rको रंगों को संभालने के लिए ध्वज की आवश्यकता होती है , जैसा कि सुझाव दिया गया है।


143
आप उपयोग करने की आवश्यकता less -Rके लिए रंग एन्कोडिंग कम सही ढंग से व्याख्या की जा करने के लिए
therefromhere

1
इसने मेरे साथ काम किया less, यह संस्करण पर निर्भर हो सकता है।
drrlvn

1
ए (उम्मीद है) उपयोगी परिशिष्ट: मुझे कुछ मैचों को छोड़कर, लेकिन रंग को बनाए रखने की आवश्यकता थी, इसलिए मैं वास्तव में समाप्त हो गया grep pattern file | grep -v badpattern | grep --colour=always pattern | less -R, जो मेरी आवश्यकताओं को पूरी तरह से पूरा करता था। (एक बार फिर धन्यवाद!)
ओवेन ब्लैकर

7
मुझे विश्वास नहीं हो रहा है कि उन्होंने अभी-अभी रंग-हैंडलिंग सुविधा लागू की है lessऔर इसलिए एक विशेष colorlessउपकरण का मौका चूक गए हैं । केवल नाम के लिए यह किया जाना चाहिए था! मुझे शायद एक पैच लिखना चाहिए जो कि इनवॉइस -R स्वचालित रूप से करता है जब बाइनरी के रूप में चलाया जाता है colorless
क्रिश्चियन

2
@OwenBlacker यह एक उपनाम नहीं हो सकता है। आप के $LESSसाथ सेट हो सकता है -R
ग्रेफेड

27

आप इसे अपनी .bashrcफ़ाइल में रख सकते हैं :

export GREP_OPTIONS="--color=always"

या इस तरह एक उपनाम बनाएँ:

alias grepc="grep --color=always"

और आपको -Rविकल्प का उपयोग करने की आवश्यकता होगी less, जैसा कि इसके द्वारा बताया गया है


29
चेतावनी !: GREP_OPTIONS = "- color = हमेशा" कई स्क्रिप्ट को तोड़ सकता है जो grep (या (e | f) grep) का उपयोग करते हैं।
mctylr

4
हाँ, बेहतर सिर्फ उर्फ ​​grep के लिए। आप हमेशा के grepसाथ शुद्ध हो सकते हैं GREP, या --colorमैन्युअल रूप से विकल्प को ओवरराइड कर सकते हैं ।
22 मई को asmeurer

यह मेरे लिए काम नहीं करता है, अलियास हालांकि काम करता है।
सईदग्नू

9

इस तरह के मामले में, मैं वास्तव में छोटे sh फाइल बनाना और उन्हें रखना पसंद करता हूं /usr/local/bin
मैं आमतौर पर grepपुनरावर्ती तरीके से उपयोग करता हूं pwd, इसलिए मेरी व्यक्तिगत लिपि:

#!/bin/sh
grep --color=always -r "$@" . | less -R

और फिर मैंने इसे कॉपी किया है /usr/local/bin/g(हाँ, मैं इसका बहुत उपयोग करता हूं)


2
केवल इस तरह की चीज़ के लिए शेल फ़ंक्शन का उपयोग क्यों नहीं किया जाता है? g() { grep --color=always -r "$@" . | less -R }काम करता है पहचान और शायद (बेहतर प्रदर्शन) दे देंगे।
00dani

1
@ 00dani हाँ, यह एक वैध विकल्प भी है और कभी-कभी मैं इसका उपयोग करता हूं। कृपया ध्यान दें कि इस मामले में, अधिकांश समय IO में व्यतीत होता है और इसलिए कोई उल्लेखनीय प्रदर्शन को बढ़ावा देने वाला नहीं है :) एक और अंतर यह है कि एक बार आपके PATH में, इस स्क्रिप्ट का उपयोग अन्य शेल स्क्रिप्ट और उपनामों के साथ भी किया जा सकता है; इसके बजाय फ़ंक्शन को स्पष्ट रूप से लोड करने की आवश्यकता है
Iazel

1

उपनाम "grep" मत करो, उपनाम "कम" के लिए बेहतर है जो कभी भी गोले द्वारा उपयोग नहीं किया जाता है। अपने में .bashrcबस डाल: alias less="less -r"


3
बिलकुल ठीक नहीं। एक दोनों का उपयोग करने की जरूरत है grep --color=alwaysऔर less -R। ध्यान दें कि grep केवल यह जानता है कि इसे किसी अन्य प्रक्रिया में पाइप किया जा रहा है और --color=autoविकल्प केवल इस जानकारी का उपयोग करता है यह तय करने के लिए कि क्या रंग का उत्पादन करेगा या नहीं।
ब्रांडीज़ी

3
ध्यान दें कि lessविकल्प -rकी तुलना में अलग है -R। शायद -Rसुरक्षित है।
क्रेग मैकक्वीन

1
तो क्यों मेरे समाधान नीचे वोट। ओपी विशेष रूप से less'- कलर' विकल्प का उपयोग करके पहले से ही उदाहरण के साथ पूछते हैं ।
15

3
एक उपनाम शायद यहाँ अवांछनीय है। lessएक $LESSपर्यावरण चर का समर्थन करता है । इसलिए, एक उपनाम के बजाय, export LESS='-R'बेहतर हो सकता है।
ग्रेफेड

0

मुझे दौड़ने की जरूरत है

grep --color=always -R "search string" * | less - r

साथ -r के बाद झंडा कम , क्रम में इस चलाने के लिए।


क्या करता *है? Grep के मैन पेज से: *: The preceding item will be matched zero or more times.लेकिन मुझे अभी भी समझ नहीं आया है ..!
शयन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.