Ls के आउटपुट कॉलम को कैसे कलर करें?


8

का शीर्षक तरह यह सब कहते हैं: मैं की तरह कुछ के उत्पादन में से जो साफ रंग का कॉलम प्राप्त करना चाहते हैं ls -alके रूप में,, कहते हैं 10basetom का जवाब करने के लिए इस सवाल का

लिंक किए गए उत्तर से सिंटैक्स-हाइलाइट किए गए कोड स्निपेट का स्क्रीनशॉट


खैर, यह एक साफ विचार है! लेकिन आप किस ओएस पर हैं?
जेकगोल्ड

2
यह एसई सॉफ्टवेयर द्वारा बैश सिंटैक्स-हाइलाइट किए गए (गलत तरीके से) लग रहे हैं। ऐसा लगता है कि यह कॉलम द्वारा रंगीन नहीं है, बल्कि अंकों (संख्याओं) को एक रंग मिलता है और एक अपरकेस के साथ शुरू होने वाला कुछ और मिलता है। प्रति-स्तंभ रंग उल्लेखनीय है, बल्कि भिन्न है।
बॉब

3
सामान्य अर्थ में, आप स्तंभ विभाजकों पर आउटपुट को विभाजित कर सकते हैं sedया awkएक ANSI एस्केप अनुक्रम डाल सकते हैं
बॉब

सम्बंधित: superuser.com/q/665274
टायसन

मैं विंडोज 10 उबंटू सबसिस्टम पर हूं, लेकिन macOS में बदलाव (पूरी आपदा को देखते हुए कि WinX निकला ...)
Pirx

जवाबों:


8

इसके साथ उल्लेखनीय है awk। दुर्भाग्य से, के प्रारूप ls -lअनिर्दिष्ट होने के बाद से, एक समाधान के साथ आना संभव नहीं है जो हर प्रणाली पर काम करेगा इसलिए कुछ समायोजन किस रंग का उपयोग करना है, इसके लिए कुछ प्रणालियों पर कॉलम आवश्यक होगा।


सबसे पहले, हम उपयोग किए गए मूल स्थानों को संरक्षित करना चाहते हैं ls -l। अन्यथा, कॉलम संरेखण गलत होगा। हम FPATविकल्प के साथ ऐसा कर सकते हैं , इस SO उत्तर के लिए धन्यवाद :

ls -la | awk '
    BEGIN {
        FPAT = "([[:space:]]*[^[:space:]]+)";
        OFS = "";
    }

में awk, प्रत्येक स्थितीय परम ( $1, $2आदि) एक क्षेत्र, वर्तमान पंक्ति पर यानी एक स्तंभ को दर्शाता है। FPATऊपर दिए गए विकल्प ने सभी पूर्ववर्ती रिक्त स्थान को शामिल करने के लिए प्रत्येक फ़ील्ड को फिर से परिभाषित किया है, इसलिए जब आप printइसे वापस करते हैं तो यह रिक्त स्थान रखता है ताकि कॉलम उसी स्थिति में रहें।

अब हम कलर कोड डालने के लिए प्रत्येक फील्ड को एडिट कर सकते हैं और फिर एडिटेड आउटपुट को प्रिंट कर सकते हैं:

    {
        $2 = "\033[31m" $2 "\033[0m";
        $3 = "\033[36m" $3 "\033[0m";
        $4 = "\033[36m" $4 "\033[0m";
        $5 = "\033[31m" $5 "\033[0m";
        $6 = "\033[36m" $6 "\033[0m";
        $7 = "\033[36m" $7 "\033[0m";
        $8 = "\033[31m" $8 "\033[0m";
        print
    }
'

ध्यान दें कि प्रत्येक स्तंभ डिफ़ॉल्ट पर रीसेट वापस (है 0के बीच [और m) बाद में। यदि आप चाहते हैं कि रंग कई कॉलमों में चले, तो आप उस कोड को छोड़ सकते हैं। व्यक्तिगत रूप से, मैं प्रत्येक कॉलम को स्वतंत्र रूप से निर्दिष्ट करना पसंद करता हूं।


आप अपने में पुन: प्रयोज्य आदेश को परिभाषित कर सकते हैं .bashrc। उदाहरण के लिए:

lsc() {
    ls -la | awk '
        BEGIN {
            FPAT = "([[:space:]]*[^[:space:]]+)";
            OFS = "";
        }
        {
            $2 = "\033[31m" $2 "\033[0m";
            $3 = "\033[36m" $3 "\033[0m";
            $4 = "\033[36m" $4 "\033[0m";
            $5 = "\033[31m" $5 "\033[0m";
            $6 = "\033[36m" $6 "\033[0m";
            $7 = "\033[36m" $7 "\033[0m";
            $8 = "\033[31m" $8 "\033[0m";
            print
        }
    '
}

इस फ़ंक्शन की परिभाषा को चलाने के लिए आपको अपना bashसत्र (या रन source ~/.bashrc) पुनरारंभ करना पड़ सकता है ।

यहां से, आप बस कॉल कर सकते हैं lsc, जो आपको अपनी इच्छा के अनुसार आउटपुट देना चाहिए:

रंगीन आउटपुट का स्क्रीनशॉट


बहुत बढ़िया दोस्तों, यह लगभग वही है जो मैं चाहता हूं;; सीरियसली, हालांकि, मैं एक और ट्विस्ट जोड़ना चाहूंगा और फाइल का नाम रंगीन रखूंगा। ls -al --color = auto ऐसा करेगा, लेकिन अगर मैं सिर्फ --color विकल्प को ऊपर के समाधान में जोड़ता हूं, तो रंग कोड छीन लिए हुए प्रतीत होते हैं। क्या हम उन्हें रखने के लिए जाग सकते हैं?
पिरक्स

दूसरी टिप्पणी, यह जिज्ञासा से अधिक है: मैंने अपने मूल प्रश्न में जो उत्तर दिया था, उसमें ऐसा लग रहा है कि 10basetom ने उपरोक्त में से किसी का उपयोग नहीं किया था, और अभी भी रंगीन कॉलम थे। मुझे आश्चर्य है कि अगर ऐसा इसलिए है क्योंकि उन्होंने ls का एक अलग संस्करण, या कुछ फैंसी स्मार्ट टर्मिनल का उपयोग किया है?
पिरक्स

@Pirx उत्तर में रंग स्टैक एक्सचेंज सॉफ्टवेयर द्वारा लागू किया जाता है। यह उनके टर्मिनल से नहीं आ रहा है। यह सिर्फ इसलिए है क्योंकि आउटपुट को एक कोड ब्लॉक में चिपकाया गया था और प्रश्न में एक बैश टैग था, जो स्वचालित रूप से प्रश्न और उत्तर में किसी भी कोड टैग पर प्रकाश डालने वाले बैश सिंटैक्स को लागू करने की कोशिश करता है ... जो वास्तव में इस मामले में गलत है। समान रूप से कोड में तार मेरे जवाब में लाल हैं, भले ही मैंने जानबूझकर उन्हें रंग नहीं दिया।
बॉब

1
@Pirx उपयोग --color=always। जब तक आप फ़ाइल नाम कॉलम ( $9मेरे उदाहरण में) पर अलग-अलग रंग लागू नहीं करते हैं , तब तक awkउन्हें पास करना चाहिए।
बॉब

@Pirx साइड नोट, --color=alwaysएक GNU एक्सटेंशन है, यदि आप एक गैर-GNU सिस्टम (जैसे macOS, अन्य BSDs) पर हैं तो आपको GNU संस्करण स्थापित करना होगा या विकल्प का उपयोग करना होगा
बॉब

6

यह ls -alFलाल रंग के दूसरे कॉलम को छपेगा, तीसरे को नीले रंग में और नौवें को काले रंग में:

ls -alF | awk -v black=$(tput setaf 0) -v red=$(tput setaf 1) -v blue=$(tput setaf 4) '{$2=red $2; $3= blue $3; $9=black $9} 1'

यह सिर्फ एक उदाहरण के रूप में करना है। आप इसे अपने दिल की सामग्री के लिए अनुकूलित कर सकते हैं।

उन लोगों के लिए जो अपने कोड को कई लाइनों में फैलाते हैं:

ls -alF | awk -v black=$(tput setaf 0) \
    -v red=$(tput setaf 1) \
    -v blue=$(tput setaf 4) \
    '{
        $2=red $2
        $3= blue $3
        $9=black $9
     }

     1'

विवरण

tputआपके टर्मिनल के लिए विभिन्न प्रकार के नियंत्रण कोड बनाने के लिए एक उपयोगिता है। उदाहरण के लिए, tput setaf nकरने के लिए अग्रभूमि रंग सेट nजहां n0 से 7 तक हो सकते हैं

0  Black
1  Red
2  Green
3  Yellow
4  Blue
5  Magenta
6  Cyan
7  White

आप के बारे में अधिक पढ़ सकते हैं tputऔर उसका रंग क्षमताओं यहाँ

Awk कोड चर को परिभाषित करता है black, redऔर blueजिसमें क्रमशः काले, लाल और नीले रंग के लिए टर्मिनल कोड होते हैं। ये कोड हम जिस भी कॉलम को कलर करना चाहते हैं, उसकी शुरुआत में रखे जाते हैं।

एक चाल यह है कि रंग कोड अपने आप रीसेट नहीं होते हैं। इसलिए, जो भी अंतिम रंग आप एक पंक्ति पर निर्दिष्ट करेंगे, जब तक कि एक और रंग कमांड निर्दिष्ट न हो, अगली पंक्ति के लिए डिफ़ॉल्ट रंग हो।


1
हुह, चर को परिभाषित करने पर अच्छा कॉल। पता नहीं था कि तुम भीतर से कर सकते हो awk! मेरा सुझाव है कि आप कॉलम संरेखण को संरक्षित करने के लिए पैटर्न भी शामिल करें :)
बॉब

@ याकूब और, मुझे FPATरिक्ति को सही रखने के लिए आपकी चाल पसंद है।
जॉन 1024
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.