रंगीन grep आउटपुट: नहीं GREP_OPTIONS अलियास नहीं


10

मैं का रंगीन उत्पादन चाहते हैं grep

.... परंतु

  • रणनीति 1: GREP_OPTIONS। लेकिन यह पदावनत है। Http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html देखें
  • स्ट्रैगी 2: GREP_COLORS पहली नजर में एक समाधान की तरह दिखते हैं, लेकिन यह कुछ अलग करता है।
  • रणनीति 3: उपनाम। यह काम नहीं करता है find ... | xargs grep, क्योंकि xargs उपनामों का मूल्यांकन नहीं करता है।
  • रणनीति 4: एक सरल आवरण स्क्रिप्ट लिखें। नहीं, मुझे लगता है कि यह बहुत गंदा है और इससे अधिक परेशानी हल करती है।
  • रणनीति 5: स्रोत कोड को पैच करें
  • रणनीति 6: grep डेवलपर्स से संपर्क करें, GREP_OPTIONS के प्रतिस्थापन के लिए पूछें
  • रणनीति नीस-एंड-ईएसवाई: ... यह गायब है। मेरे पास कोई सुराग नहीं है।

इसे कैसे हल करें?

मदद करने की कोशिश करने के लिए धन्यवाद!

... लेकिन मैं इनाम नहीं दे सकता

मुझे अशिष्ट, अभिमानी, अपमानजनक, अपमानजनक कहें ...।

मैं केवल काम के आस-पास देखता हूं - कोई समाधान नहीं। प्रश्न का कोई उत्तर संतुष्ट नहीं करता है।

आपके प्रयासों के लिए धन्यवाद।


1
आपने रैपर स्क्रिप्ट (आपकी रणनीति 4) का उपयोग करने के लिए दो सुझावों को अस्वीकार कर दिया है क्योंकि "वास्तव में उत्तर नहीं"। क्या आप बता सकते हैं कि "गंदा", "परेशान करने वाला" या "वास्तव में इसका जवाब नहीं" क्या है? शायद यह एक अलग समस्या है जिसके इर्द-गिर्द काम किया जा सकता है।
जिग्गलीनाग

2
रणनीति 5 स्रोत कोड को पैच कर रहा color_optionहै2 ...
15

2
@ JigglyNaga यहाँ मेरी व्याख्या है कि एक आवरण लिपि एक समाधान क्यों नहीं है। हमारी टीम कई सर्वरों का प्रबंधन करती है। कम से कम इस समय हजार, लेकिन गिनती बढ़ रही है। हां, हम कॉन्फ़िगरेशन प्रबंधन का उपयोग करते हैं और उन सभी के लिए एक स्क्रिप्ट को तैनात करना आसान होगा। लेकिन मैं चाहता हूं कि चीजें आसान और सीधी हों (टीम में नए सदस्यों के बारे में सोचें। मैं उन्हें भ्रमित नहीं करना चाहता)। --colorविकल्प पहले से ही महत्व है auto। मुझे अभी पता नहीं है कि आप इसे डिफ़ॉल्ट रूप से सक्रिय क्यों नहीं कर सकते हैं।
गुफ्तगू

आपको रणनीति 4 या 5 का उपयोग करना चाहिए - मैं एक न्यूनतम डैश / श स्क्रिप्ट ( exec grep --color=auto "$@") के साथ रणनीति 4 पसंद करूंगा , वैकल्पिक रूप से एक अलग नाम ( grepcया colorgrep) के साथ। इसमें नगण्य ओवरहेड है (और रनटाइम में कोई अतिरिक्त समवर्ती प्रक्रिया नहीं है)। आपके द्वारा उन्हें "पर्याप्त रूप से आसान नहीं" कहने का कारण यह है कि आप इस सुविधा को लागू करने के लिए (अपेक्षाकृत कम) एक बार के प्रयास में खर्च करने के लिए पर्याप्त उपयोगी नहीं देखते हैं, और किसी और से यह आपके लिए करने की मांग कर रहे हैं। इस वजह से, आपके "वास्तव में उत्तर नहीं" पोस्ट किए गए उत्तरों पर टिप्पणी काफी असभ्य है।
नाममात्र पशु

1
@NominalAnimal हाँ, आप सही हैं "वास्तव में जवाब नहीं" असभ्य लगता है। मैं कोई देशी वक्ता नहीं हूं। कौन सा शब्द (उसी संदेश को स्थानांतरित करना) बेहतर होगा?
गुएटली

जवाबों:


13

ओपी ने जिन कारणों से विकल्पों को अनुपयुक्त बताया है उनमें से कुछ का वास्तविकता में कोई आधार नहीं है। यहाँ, मैं दिखाता हूँ कि ओपी की रणनीति 4 के उपयोग से किस तरह के प्रभाव पड़ते हैं:


अधिकांश वितरणों पर, (विशिष्ट) या (OpenSUSE, शायद अन्य) grepमें स्थापित किया गया है , और डिफ़ॉल्ट में पहले या शामिल हैं । इसका मतलब है कि यदि आप के साथ बनाते हैं/bin/usr/binPATH/usr/local/bin/bin/usr/bin/usr/local/bin/grep

#!/bin/sh
exec /bin/grep --color=auto "$@"

/bin/shआपके वितरण द्वारा प्रदान किया जाने वाला POSIX- संगत शेल कहां है, आमतौर पर बैश या डैश। अगर grepअंदर है /usr/bin, तो बनाइए

#!/bin/sh
exec /usr/bin/grep --color=auto "$@"

इस लिपि का ओवरहेड न्यूनतम है। execबयान का मतलब है कि स्क्रिप्ट दुभाषिया की जगह grepबाइनरी; इसका मतलब यह है कि शेल grepनिष्पादित होने के दौरान मेमोरी में नहीं रहता है । इस प्रकार, एकमात्र ओवरहेड स्क्रिप्ट दुभाषिया का एक अतिरिक्त निष्पादन है, अर्थात दीवार घड़ी के समय में एक छोटा विलंबता। विलंबता मोटे तौर पर स्थिर है (भिन्न होता है केवल इस आधार पर grepऔर shपृष्ठ कैश या नहीं में पहले से ही कर रहे हैं, और पर कितना मैं / हे बैंडविड्थ उपलब्ध है), और पर कब तक निर्भर नहीं करता है grepकार्यान्वित या कितना डेटा यह संसाधित करता है।

तो, वह विलंबता कब तक है, यानी ओवरहेड को रैपर लिपि द्वारा जोड़ा गया है?

पता लगाने के लिए, उपरोक्त स्क्रिप्ट बनाएं, और चलाएं

time /bin/grep --version
time /usr/local/bin/grep --version

मेरी मशीन पर, पूर्व 0.005s वास्तविक समय (बड़ी संख्या में रनों के पार) लेता है, जबकि बाद वाला 0.006s वास्तविक समय लेता है। इस प्रकार, मेरी मशीन पर आवरण का उपयोग करने का ओवरहेड 0.001 (या उससे कम) प्रति आह्वान है।

यह नगण्य है।

मैं इस बारे में कुछ भी "गंदा" देखने में विफल रहता हूं, क्योंकि कई सामान्य अनुप्रयोग और उपयोगिताओं एक ही दृष्टिकोण का उपयोग करते हैं। आपकी मशीन पर इस तरह के की सूची देखने के /binऔर /usr/bin, बस चलाने

file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'

मेरी मशीन पर, ऊपर उत्पादन भी शामिल है egrep, fgrep, zgrep, which, 7z, chromium-browser, ldd, और xfig, मैं अक्सर उपयोग करता है। जब तक आप रैपर स्क्रिप्ट्स पर भरोसा करने के लिए अपने पूरे वितरण को "गंदा" नहीं मानते हैं, तब तक आपके पास ऐसी रैपर स्क्रिप्ट्स को "गंदा" मानने का कोई कारण नहीं है।


समस्याओं के रूप में इस तरह के एक रैपर स्क्रिप्ट का कारण हो सकता है:

केवल मानव उन (के रूप में स्क्रिप्ट के खिलाफ) ग्रेप का संस्करण रंग समर्थन करता है, तो उत्पादन एक टर्मिनल के लिए है करने के लिए चूक है, तो आवरण स्क्रिप्ट नामित किया जा सकता है उपयोग कर रहे हैं colorgrepया cgrepया जो कुछ भी ओ पी फिट देखता है।

यह सभी संभव संगतता मुद्दों से बचा जाता है, क्योंकि व्यवहार grepबिल्कुल नहीं बदलता है।


grepआवरण स्क्रिप्ट के साथ विकल्प सक्षम करना , लेकिन इस तरह से जो किसी नई समस्या से बचा रहे:

हम आसानी से एक कस्टम का समर्थन करने के लिए रैपर स्क्रिप्ट को फिर से लिख सकते हैं, GREP_OPTSभले ही GREP_OPTIONSसमर्थित नहीं थे (जैसा कि यह पहले से ही पदावनत है)। इस तरह से उपयोगकर्ता केवल export "GREP_OPTIONS=--color=auto"अपनी प्रोफ़ाइल में जोड़ या समान कर सकते हैं। /usr/local/bin/grepतब है

#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"

ध्यान दें कि आसपास कोई उद्धरण नहीं हैं $GREP_OPTIONS, ताकि उपयोगकर्ता एक से अधिक विकल्प निर्दिष्ट कर सकें।

मेरे सिस्टम पर, खाली के time /usr/local/bin/grep --versionसाथ GREP_OPTIONS, या के साथ निष्पादित , GREP_OPTIONS=--color=autoरैपर स्क्रिप्ट के पिछले संस्करण के समान तेज़ है; यानी, आम तौर पर सादे की तुलना में एक मिलीसेकंड से अधिक समय लगता है grep

यह अंतिम संस्करण वह है जिसे मैं व्यक्तिगत रूप से उपयोग के लिए सुझाऊंगा।


सारांश में, ओपी की रणनीति 4:

  • grepडेवलपर्स द्वारा अनुशंसित क्षेत्र है

  • लागू करने के लिए तुच्छ है (दो लाइनें)

  • नगण्य ओवरहेड है (एक मिलीसेकंड अतिरिक्त विलंबता प्रति आह्वान इस विशेष लैपटॉप पर; आसानी से प्रत्येक मशीन पर सत्यापित)

  • एक रैपर स्क्रिप्ट के रूप में लागू किया जा सकता है जो GREP_OPTSसमर्थन जोड़ता है (पदावनत / असमर्थित को बदलने के लिए GREP_OPTIONS)

  • लागू किया जा सकता है (के रूप में colorgrep/ cgrep) स्क्रिप्ट या मौजूदा उपयोगकर्ताओं को बिल्कुल प्रभावित नहीं करता है

क्योंकि यह एक ऐसी तकनीक है जो पहले से ही लिनक्स वितरण में व्यापक रूप से उपयोग की जाती है, यह एक सामान्य तकनीक है और "गंदा" नहीं है।

यदि एक अलग आवरण ( colorgrep/ cgrep) के रूप में लागू किया जाता है , तो यह नई समस्याएं पैदा नहीं कर सकता क्योंकि यह grepव्यवहार को प्रभावित नहीं करता है । यदि एक आवरण स्क्रिप्ट के रूप में लागू किया जाता है जो GREP_OPTSसमर्थन जोड़ता है , तो उपयोग GREP_OPTS=--color=autoमें बिल्कुल समान जोखिम (मौजूदा स्क्रिप्ट के साथ समस्याएँ) हैं जो कि डिफ़ॉल्ट रूप से जोड़ना --color=autoहोगा। इस प्रकार, यह टिप्पणी कि "यह हल करता है की तुलना में अधिक समस्याएं पैदा करता है" पूरी तरह से गलत है: कोई अतिरिक्त समस्याएं पैदा नहीं होती हैं।


3

पहली रणनीति के साथ आपके द्वारा प्रदान किया गया दस्तावेज़ कहता है:

कृपया इसके बजाय किसी अन्य नाम या स्क्रिप्ट का उपयोग करें। उदाहरण के लिए, अगर grep निर्देशिका '/ usr / bin' में है, तो आप अपने PATH में $ HOME / bin को प्रीपेन्ड कर सकते हैं और एक निष्पादन योग्य स्क्रिप्ट $ HOME / bin / grep बना सकते हैं जिसमें निम्नलिखित शामिल हैं:

#! /bin/sh
export PATH=/usr/bin
exec grep --color=auto --devices=skip "$@"

इसलिए यदि आपके लिए उपनाम असंभव है, तो रैपर स्क्रिप्ट एकमात्र तरीका है।


यह रणनीति 4 है ... वास्तव में उत्तर नहीं।
गुफ्तगू

3

कारण GREP_OPTIONSचर अमान्य हो चुकी है कि यह जब कारण समस्याओं जाता है grepएक स्क्रिप्ट में कहीं कहा जाता है और स्क्रिप्ट वैकल्पिक विकल्पों कि चर से आते हैं के साथ काम नहीं करता है। यदि आप एक रैपर स्क्रिप्ट लिखते हैं grepतो आपको एक ही समस्या है, जब तक कि आप इसे अलग नाम न दें

$ cat ~/bin/cgrep
#!/bin/sh
exec grep --color=always "$@"
$ find  -exec cgrep  {} +

वैकल्पिक रूप से, अपने पसंदीदा विकल्पों को एक चर में संग्रहित करें। Zsh के अलावा अन्य गोले में, यह बोझिल होता है यदि विकल्पों में वाइल्डकार्ड वर्ण ( \[*?) होते हैं , लेकिन अन्यथा आप तर्कों के साथ कमांड प्राप्त करने के लिए बिना लिखे हुए चर का उपयोग कर सकते हैं।

cgrep=(grep --color=always)
find  -exec $cgrep  {} +

ध्यान दें कि GNU और BSD grep एक डायरेक्टरी ट्री को पुनरावर्ती रूप से संसाधित कर सकते हैं, जो कि अधिकांश समय findसंयोजन की आवश्यकता को कम grepकरता है।


1
यह रणनीति 4 है ... वास्तव में उत्तर नहीं।
गुफ्तगू

@guettli, यह सही उत्तर है। यदि आप एक अलग व्यवहार के साथ एक कमांड चाहते हैं grep, तो आपको एक अलग नाम के साथ एक कमांड की आवश्यकता है, या यदि आप एक ही नाम रखते हैं, तो आप उन स्क्रिप्ट को तोड़ देंगे जो मूल / मानक व्यवहार की अपेक्षा करते हैं। यह सबसे साफ है और अतिरिक्त परेशानी का कारण नहीं है
स्टीफन चेज़ेलस

@ स्टीफनचैलेजेलस हाँ आप सही हैं। यह आपकी बात के अनुसार सही उत्तर है।
गुत्थी

1

सबसे आसान काम एक उपनाम (रणनीति 3) का उपयोग करना है। यदि आप वास्तव में xargsकमांड के बारे में परवाह करते हैं , तो आप इसे बैश फ़ंक्शन के साथ ओवरराइड कर सकते हैं।

alias grep='grep --color'
xargs() {
    local args
    for ((i=1; i<=$#; i++))
    do
            if [[ "-E -L -P -I -s -d" == *"${!i}"* ]]; then
                    ((i=i+1))
            elif [[ ${!i:0:1} != "-" ]]; then
                    if [[ ${!i} == "grep" ]]; then
                            args="--color"
                    fi
                    /usr/bin/xargs ${@:1:i} $args ${@:i+1}
                    return;
            fi
    done
}

लेकिन यह एक रैपर कमांड का उपयोग करने से बेहतर नहीं है जो grepटीम द्वारा अनुशंसित समाधान प्रतीत होता है :

/usr/local/bin/grep:

#!/bin/bash
/bin/grep --color "$@"

मेरी विनम्र राय में, आपको grepडेवलपर टीम से संपर्क करके उनसे GREP_OPTIONSवैरिएबल को एक सरल प्रतिस्थापन प्रदान करने के लिए कहना चाहिए जो grepकि कुछ पर्यावरण चर के अनुसार रंग को सक्षम करेगा ।

उनके लिए डिफ़ॉल्ट रूप से colorया जब GREP_COLORSसेट किया गया हो तो सक्षम करना काफी सरल होगा ।


1
"... आपको grep डेवलपर टीम से संपर्क करना चाहिए ..." के लिए धन्यवाद। इससे मुझे सकारात्मक प्रतिक्रिया मिलती है। अब मुझे पता है कि मैं अकेला नहीं हूं जो सोचता है कि यहां कुछ याद आ रहा है।
गुएटली

मैंने आपकी टिप्पणी "... आप grep डेवलपर टीम से संपर्क करना चाहिए ..." को सवाल के लिए रणनीति 6 के रूप में जोड़ा। अब तक यह मेरा पसंदीदा जवाब है।
गुएटली

0

यह @NominalAnimal द्वारा शीर्ष उत्तर से समाधान है लेकिन सामान्य grep: ...चेतावनी के साथ (इसके बजाय /bin/grep: ...):

#!/bin/bash
exec -a grep /bin/grep --color=auto "$@"

मुझे पता है कि रैपर कैसे लिखना है। एक रैपर इस संदर्भ में एक समाधान नहीं है।
गुएटली

@guettli खैर, उत्तर का मतलब आपकी स्थिति को ठीक से संबोधित करना नहीं था ... यदि टिप्पणियों में उत्तर के रूप में समान स्वरूपण विशेषताएँ होतीं, तो वह एक टिप्पणी होती। (और मैं इसी तरह के संपादन को अस्वीकार कर दिया था, जैसा कि मूल लेखक या कुछ और के द्वारा इरादा नहीं है।) आपकी स्थिति के अनुसार, मुझे लगता है कि आपके प्रश्न का एक उचित शाब्दिक उत्तर है: एक और "रणनीति नीस-एंड-ईएसवाई" मौजूद नहीं है।
किरिल ब्यूलगिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.