रंग द्वारा कमांड का फ़िल्टर आउटपुट


13

मैं एक उपयोगिता चला रहा हूं जो इसके आउटपुट को फिल्टर करने का तरीका नहीं देता है। आउटपुट के पाठ में कुछ भी इंगित नहीं करता है कि एक विशेष फ़ंक्शन विफल हो गया है लेकिन यह लाल रंग में दिखाई देता है। आउटपुट इतना लंबा है कि अंत में जब कुछ # त्रुटियों की रिपोर्ट होती है तो मैं हमेशा आउटपुट को देखने के लिए स्क्रॉल नहीं कर सकता जहां त्रुटि हुई।

मैं गैर-लाल पाठ को कैसे फ़िल्टर कर सकता हूं?

छद्म कोड:

dolongtask | grep -color red

संपादित करें

आदेश में अच्छी तरह से अन्य रंग आउटपुट और मैं फिल्टर करने के लिए सक्षम होना चाहिए बाहर वाले सभी पाठ को नहीं है लाल। साथ ही टेक्स्ट कलरिंग मल्टीलाइन है।


1
मैं स्पष्ट पूछने के लिए माफी चाहता हूं - लेकिन सभी आउटपुट चालू है >&1? मेरा मतलब है, लाल सामान दूर नहीं जाता है यदि आप 2>/dev/null, ठीक है?
मिकसेर

जवाबों:


15

रंग को स्विच करना पाठ में एम्बेडेड एस्केप सीक्वेंस के माध्यम से किया जाता है । वास्तव में , कार्यक्रम एएनएसआई से बचने के क्रम जारी करते हैं , क्योंकि आजकल लगभग सभी टर्मिनल समर्थन करते हैं।

भागने के क्रम को लाल रंग में बदलने के लिए भागने का क्रम है \e[31m, जहां \eएक भागने चरित्र (ओक्टल 033, हेक्साडेसिमल 1 बी, जिसे ईएससी, ^[और विभिन्न अन्य पदनाम भी कहा जाता है ) को नामित करता है। 30-39 की संख्या में अग्रभूमि रंग सेट करें; अन्य संख्याएँ अलग-अलग विशेषताएँ निर्धारित करती हैं। \e[0mसभी विशेषताओं को उनके डिफ़ॉल्ट मान पर रीसेट करता है। cat -vप्रोग्राम क्या प्रिंट करता है यह जाँचने के लिए चलाएँ , यह कुछ वैरिएंट का उपयोग कर सकता है जैसे कि \e[0;31mपहले सभी विशेषताओं को रीसेट करने के लिए, या \e[3;31इटैलिक को भी स्विच करना (जो कई टर्मिनल समर्थन नहीं करते हैं)।

Ksh, bash या zsh में, आप $'…'बैकस्लैश को कोट्स के अंदर भागने में सक्षम करने के लिए उपयोग कर सकते हैं , जिससे आप $'\e'एक एस्केप कैरेक्टर प्राप्त कर सकते हैं। ध्यान दें कि फिर आपको किसी भी बैकस्लैश को दोगुना करना होगा जिसे आप पास करना चाहते हैं grep। में /bin/sh, आप "$(printf \\e)"एक शाब्दिक बच चरित्र का उपयोग या टाइप कर सकते हैं ।

जीएनयू grep -oविकल्प के साथ, निम्नलिखित स्निपेट लाल पाठ को फ़िल्टर करता है, यह मानते हुए कि यह एस्केप अनुक्रम से शुरू होता है \e[31m, \e[0mया तो या \e[30mउसी लाइन पर समाप्त होता है , और इसमें कोई एम्बेडेड एस्केप अनुक्रम नहीं होता है।

grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'

निम्नलिखित awkस्निपेट लाल टेक्स्ट को निकालता है, तब भी जब वह मल्टीलाइन हो।

awk -v RS='\033' '
    match($0, /^\[[0-9;]*m/) {
        color = ";" substr($0, 2, RLENGTH-2) ";";
        $0 = substr($0, RLENGTH+1);
        gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
        red = (color ~ /1;*$/)
    }
    red'

यहां एक भिन्नता है जो रंग बदलने वाली आज्ञाओं को बनाए रखती है, जो कि यदि आप कई रंगों (यहां लाल और मैजेंटा) को फ़िल्टर कर रहे हैं तो उपयोगी हो सकता है।

awk -v RS='\033' '
    match($0, /^\[[0-9;]*m/) {
        color = ";" substr($0, 2, RLENGTH-2) ";";
        printf "\033%s", substr($0, 1, RLENGTH);
        $0 = substr($0, RLENGTH+1);
        gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
        desired = (color ~ /[15];*$/)
    }
    desired'

अजीब समाधान मेरे लिए काम किया। आउटपुट में रंग बनाए रखने का कोई तरीका?
km6zla

@ ऑग-निक आप सभी लाल आउटपुट चाहते हैं? printf '\e[31m'; awk …; printf '\e[0m'
गिल्स एसओ- बुराई को रोकें '

बस जिस भी रंग के लिए फ़िल्टर कर रहा हूं, उसे आउटपुट में बनाए रखा जाएगा।
km6zla

@ ogc-nick मेरा संपादन देखें।
गिल्स एसओ- बुराई को रोकें '

6

आप नियंत्रण वर्णों के लिए संक्षिप्त रूप देख सकते हैं, जिनमें से कुछ टर्मिनल पर सुंदर रंग बनाने के लिए जिम्मेदार हैं।

dolongtask | grep '[[:cntrl:]]'

उदाहरण के लिए, यह ग्रीप में एक लाल "परीक्षण" गूँजता है, जो इसे नियंत्रण पात्रों से घिरा होने के कारण पाता है:

$ echo -e '\033[00;31mtest\033[00m' | grep --color=none '[[:cntrl:]]'
test     <-- in red

--color=noneबस सुनिश्चित ग्रेप का मिलान नहीं हुआ उत्पादन के लिए अपने स्वयं के colorization लागू नहीं होता है बनाने के लिए है, लेकिन ईमानदारी से इतना है कि नियंत्रण वर्ण खोल से व्याख्या की जाएगी पूरी लाइन प्रिंट करता है।


अच्छा लगा। मुझे आश्चर्य है कि अगर कोई और आगे बढ़ सकता है grep -E $'\033\[0?[01];31m.+?\033\[0?0m'या grep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'लाल रंग के लिए विशेष रूप से परीक्षण कर सकता है ?
स्टीलड्राइवर

आप जैसे सुझाव देते हैं, वैसा ही मैं फिर से करना शुरू कर देता हूं, लेकिन इससे पहले कि मैं उन्हें काम पर ला पाता, मैं लड़खड़ा गया [[:cntrl:]]। मैंने तुम्हारा परीक्षण किया और वे मेरे लिए काम करते हैं, अर्थात। लाल रंग का मेल और अन्य रंगों से मेल खाने में विफल।
सवंतो

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