का शीर्षक तरह यह सब कहते हैं: मैं की तरह कुछ के उत्पादन में से जो साफ रंग का कॉलम प्राप्त करना चाहते हैं ls -al
के रूप में,, कहते हैं 10basetom का जवाब करने के लिए इस सवाल का ।
sed
या awk
एक ANSI एस्केप अनुक्रम डाल सकते हैं ।
का शीर्षक तरह यह सब कहते हैं: मैं की तरह कुछ के उत्पादन में से जो साफ रंग का कॉलम प्राप्त करना चाहते हैं ls -al
के रूप में,, कहते हैं 10basetom का जवाब करने के लिए इस सवाल का ।
sed
या awk
एक ANSI एस्केप अनुक्रम डाल सकते हैं ।
जवाबों:
इसके साथ उल्लेखनीय है 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
, जो आपको अपनी इच्छा के अनुसार आउटपुट देना चाहिए:
--color=always
। जब तक आप फ़ाइल नाम कॉलम ( $9
मेरे उदाहरण में) पर अलग-अलग रंग लागू नहीं करते हैं , तब तक awk
उन्हें पास करना चाहिए।
यह 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
जहां n
0 से 7 तक हो सकते हैं
0 – Black
1 – Red
2 – Green
3 – Yellow
4 – Blue
5 – Magenta
6 – Cyan
7 – White
आप के बारे में अधिक पढ़ सकते हैं tput
और उसका रंग क्षमताओं यहाँ ।
Awk कोड चर को परिभाषित करता है black
, red
और blue
जिसमें क्रमशः काले, लाल और नीले रंग के लिए टर्मिनल कोड होते हैं। ये कोड हम जिस भी कॉलम को कलर करना चाहते हैं, उसकी शुरुआत में रखे जाते हैं।
एक चाल यह है कि रंग कोड अपने आप रीसेट नहीं होते हैं। इसलिए, जो भी अंतिम रंग आप एक पंक्ति पर निर्दिष्ट करेंगे, जब तक कि एक और रंग कमांड निर्दिष्ट न हो, अगली पंक्ति के लिए डिफ़ॉल्ट रंग हो।
awk
! मेरा सुझाव है कि आप कॉलम संरेखण को संरक्षित करने के लिए पैटर्न भी शामिल करें :)
FPAT
रिक्ति को सही रखने के लिए आपकी चाल पसंद है।