कैसे आप केवल कुछ कीवर्ड को बैश स्क्रिप्ट के लिए कलर कर सकते हैं?


10

मैं कुछ यूनिट टेस्ट कोड चला रहा हूं। यूनिट टेस्ट कोड नियमित पाठ को आउटपुट करता है। बहुत सारे पाठ है इसलिए मैं उपयोगकर्ता के महत्वपूर्ण कीवर्ड के लिए हाइलाइट करना चाहता हूं।

इस मामले में कीवर्ड "पास" और "विफल" हैं।

आप कैसे "PASS" को हरा होने के लिए और "FAIL" को लाल होने के लिए कैसे रंगेंगे?


क्या आपने पास किए गए परीक्षणों के stdout / stderr के बारे में सोचा है, और असफल परीक्षणों के लिए केवल stdout / stderr की छपाई कर रहे हैं? PHPUnit ऐसा करता है, या ऐसा करने के लिए कॉन्फ़िगर करने योग्य है। मैंने पाया है कि यह दृष्टिकोण काफी अच्छा काम करता है, वाईएमएमवी।
क्लेटन स्टेनली

जवाबों:


8

supercat लगता है कि तुम क्या देख रहे हो।

पैकेज: सुपरकैट
विवरण-एन: प्रोग्राम जो टर्मिनलों और HTML के लिए पाठ को रंगीन करता है
 सुपरकैट एक ऐसा कार्यक्रम है जो नियमित मिलान के आधार पर पाठ को रंग देता है
 भाव / तार / अक्षर। Supercat html आउटपुट को भी सपोर्ट करता है
 मानक ASCII पाठ के रूप में। कुछ टेक्स्ट-कलरिंग कार्यक्रमों के विपरीत जो कि
 मौजूद है, सुपरकैट के लिए आपको प्रोग्रामर होने की आवश्यकता नहीं है
 रंग बनाने के नियम।
मुखपृष्ठ: http://supercat.nosredna.net/

यह बताने का कोई तरीका प्रतीत नहीं होता है कि कमांड लाइन पर क्या करना है, आपको एक विन्यास फाइल निर्दिष्ट करनी होगी।

मुझे याद है कि 'हिलिट' या 'एचएल' नामक एक कार्यक्रम हुआ करता था grep --colour, जो एक पैटर्न से मेल खाने वाले पाठ को हाइलाइट करता था (जैसे , लेकिन गैर-मिलान लाइनों को भी प्रदर्शित करता है), लेकिन जब मैंने इसे खोजा तो मुझे यह नहीं मिला।

अंत में, जीएनयू grepका उपयोग पैटर्न को उजागर करने के लिए किया जा सकता है - लेकिन केवल एक रंग का उपयोग किया जा सकता है (यानी आप हरे रंग में पास नहीं हो सकते हैं और लाल रंग में विफल हो सकते हैं, दोनों एक ही रंग के साथ हाइलाइट किए जाएंगे)।

अपने डेटा को कुछ इस तरह से पाइप करें:

egrep --color "\b(PASS|FAIL)\b|$"

यह उदाहरण egrep (aka grep -E) का उपयोग करता है , लेकिन -Gमूल regexp, -Fफिक्स्ड-स्ट्रिंग और -PPCRE भी काम करता है।

सभी मैचों पर प्रकाश डाला जाएगा। डिफ़ॉल्ट लाल है, या GREP_COLOR env var सेट करें।

इस काम की कुंजी यह है कि |$पैटर्न में अंतिम अंत-लाइन से मेल खाता है (अर्थात सभी लाइनें मेल खाती हैं) इसलिए सभी लाइनें प्रदर्शित की जाएंगी (लेकिन रंगीन नहीं)।

\bशब्द सीमा मार्करों इतना है कि यह मेल खाता है जैसे असफल नहीं बल्कि असफलता है। वे आवश्यक नहीं हैं, इसलिए यदि आप आंशिक शब्दों से मेल खाना चाहते हैं तो उन्हें हटा दें।

यहाँ सुपरकैट के लिए उदाहरण रैपर स्क्रिप्ट है जो मैंने कल लिखा था। यह काम करता है, लेकिन इसे लिखने में, मुझे पता चला कि सुपरकैट में केस-असंवेदनशील खोजों के लिए कोई विकल्प नहीं है। IMO, जो प्रोग्राम को काफी कम उपयोगी बनाता है। हालाँकि, इसने स्क्रिप्ट को बहुत सरल कर दिया क्योंकि मुझे '-i' विकल्प लिखना नहीं था :)

#! /bin/bash 

# Requires: tempfile from debian-utils, getopt from util-linux, and supercat

SCRIPTNAME=$(basename $0)
CFGFILE=$(tempfile -p spc)

usage() {
  cat <<__EOF__
Highlight regexp patterns found on stdin or files specified on command
line with specified colours.

Usage: $SCRIPTNAME [ --colour "pattern" ...] [FILE]

Options:

        -k,--black   regexp
        -r,--red     regexp
        -g,--green   regexp
        -y,--yellow  regexp
        -b,--blue    regexp
        -m,--magenta regexp
        -c,--cyan    regexp
        -w,--white   regexp

Example:

    run-script.sh | $SCRIPTNAME --green PASS --red FAIL

__EOF__
  exit 0
}


# Format definition from the spc man page:
#1234567890123456789012345678901234567890123456789012345
#HTML Color Name      Col A N T RE / String / Characters
FMT="%-20s %3s %1s %1s %1s (%s)\n"

add_color_to_config() {
  COLOR="$1"
  PATTERN="$2"

  printf "$FMT" "$COLOR" "$COLOR" - 0 r "$PATTERN" >> "$CFGFILE"
}


# uses the "getopt" program from util-linux, which supports long
# options. The "getopts" built-in to bash does not.
TEMP=$(getopt \
       -o 'hk:r:g:y:b:m:c:w:' \
       -l 'help,black:,red:,green:,yellow:,blue:,magenta:,cyan:,white:' \
       -n "$0" -- "$@")

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

eval set -- "$TEMP"

while true ; do
    case "$1" in
        -k|--bla*)       add_color_to_config blk "$2" ; shift 2 ;;
        -r|--red)        add_color_to_config red "$2" ; shift 2 ;;
        -g|--gre*)       add_color_to_config grn "$2" ; shift 2 ;;
        -y|--yel*)       add_color_to_config yel "$2" ; shift 2 ;;
        -b|--blu*)       add_color_to_config blu "$2" ; shift 2 ;;
        -m|--mag*)       add_color_to_config mag "$2" ; shift 2 ;;
        -c|--cya*)       add_color_to_config cya "$2" ; shift 2 ;;
        -w|--whi*)       add_color_to_config whi "$2" ; shift 2 ;;

        -h|--hel*)       usage ; exit 0 ;;

        --)         shift ; break ;;

        *)          echo 'Unknown option!' ; exit 1 ;;
    esac
done

spc -R -c "$CFGFILE" "$@"
rm -f "$CFGFILE"

1
BTW, यदि आप उपयोग supercatकरते हैं , तो आप कमांड-लाइन आर्ग के आधार पर एक अस्थायी कॉन्फ़िग फ़ाइल बनाने के लिए आपके द्वारा पोस्ट की गई स्क्रिप्ट को संशोधित कर सकते हैं, और फिर कॉल कर सकते हैं spc -c /path/to/your/temp/config। यह आपको कमांड लाइन पर अलग-अलग पैटर्न के लिए अलग-अलग रंगों को आसानी से निर्दिष्ट करने की अनुमति देगा।
कैस

भी btw, मैंने ऐसा करने के लिए एक साधारण आवरण स्क्रिप्ट लिखी। मुझे अब काम करना है, लेकिन मैं इसे साफ कर दूंगा, कुछ टिप्पणियां आदि जोड़ूंगा और आज इसे बाद में पोस्ट करूंगा।
कैस

5

यहां रेगेक्स पैटर्न को रंगने के लिए एक सामान्य-उद्देश्य स्क्रिप्ट है (शायद कुछ रीटचिंग की आवश्यकता है):

#! /bin/bash

color_to_num () {
  case $1 in
    black)  echo 0;;
    red)    echo 1;;
    green)  echo 2;;
    yellow) echo 3;;
    blue)   echo 4;;
    purple) echo 5;;
    cyan)   echo 6;;
    white)  echo 7;;
    *)      echo 0;;
  esac
}

# default values for foreground and background colors
bg=
fg=
bold="$(tput bold)"
italics=""
boundary=""

while getopts f:b:sli option; do
  case "$option" in
    f) fg="$OPTARG";;
    b) bg="$OPTARG";;
    s) bold="";;
    l) boundary=".*";;
    i) italics="$(tput sitm)";;
  esac
done

shift $(($OPTIND - 1))

pattern="$*"

if [ -n "$fg" ]; then
  fg=$(tput setaf $(color_to_num $fg))
fi
if [ -n "$bg" ]; then
  bg=$(tput setab $(color_to_num $bg))
fi

if [ -z "$fg$bg" ]; then
  fg=$(tput smso)
fi

sed "s/${boundary}${pattern}${boundary}/${bold}${italics}${fg}${bg}&$(tput sgr0)/g"

इसे नाम दें hilite.shऔर इसे इस तरह से उपयोग करें:

$ ./BIN_PROGRAM | hilite.sh -f green PASS | hilite.sh -f red FAIL

$ # Here is an example one liner
$ echo -e "line 1: PASS\nline 2: FAIL" | hilite.sh -f green PASS | hilite.sh -f red FAIL

मैंने ऐसा community wikiइसलिए किया क्योंकि मेरा समाधान काम नहीं करता।
ट्रेवर बॉयड स्मिथ

परीक्षण करने का एक आसान तरीका एक और स्क्रिप्ट बनाना है जो कि "PASS" और "FAIL" कीवर्ड के साथ ईकोस टेक्स्ट बनाता है। तब इसे इस लिपि द्वारा बुलाया जाएगा।
ट्रेवर बॉयड स्मिथ

विषय से थोड़ा हटकर, लेकिन मुझे यह बताना होगा कि कमांड प्रतिस्थापन के $BINमाध्यम से आउटपुट को पार्स करना evalसंभवत: नाजुक, बोझिल और खतरनाक है। STDOUT एक स्ट्रीम है और आमतौर पर टूल की तरह स्ट्रीम द्वारा प्रोसेस किया जाता है। एक वैरिएबल में संपूर्ण स्ट्रीम कैप्चर करने की कोशिश बहुत कुशल नहीं है। इसके अलावा, evalखतरनाक रूप से शक्तिशाली है , इसलिए केवल इसका उपयोग करें यदि आप वास्तव में जानते हैं कि आप क्या कर रहे हैं।
jw013

मैंने स्क्रिप्ट को एक काम के साथ बदल दिया।
कोण

@angus, वास्तव में अच्छी और प्रभावशाली स्क्रिप्ट IMO है।
ट्रेवर बोयड स्मिथ

3

अभिव्यक्ति tputको sedप्रतिस्थापित करने में मनमाने तार (जैसे आउटपुट) को एंबेड करना समस्याग्रस्त है क्योंकि आपको यह सुनिश्चित करना है (बचकर) स्ट्रिंग मान्य sedसिंटैक्स है, जो कि अधिक जटिलता है जो सबसे अच्छा बचा जाता है। मैं awkइसके बजाय प्रयोग करेंगे । एक उदाहरण के रूप में:

{ echo line 1: PASS; echo line 2: FAIL; } | 
    awk -v "red=$(tput setaf 1)" -v "green=$(tput setaf 2)" \
        -v "reset=$(tput sgr0)" '
    { for (i = 1; i <= NF; i++) {
           if ($i == "FAIL") printf "%s", red "FAIL" reset;
           else if ($i == "PASS") printf "%s", green "PASS" reset;
           else printf "%s", $i

           if (i == NF) printf "%s", ORS
           else printf "%s", OFS 
      }}'

कुंजी चर का tputअनुक्रम असाइन करने के लिए awkहै, यहां -vविकल्पों का उपयोग करके किया गया है ।


मैंने आपका कार्यक्रम चलाया और इसकी आवश्यकता है। हुज़्ज़ाह! लेकिन दुर्भाग्य से मैं एक जागृत गुरु नहीं हूं इसलिए मुझे यह समझना मुश्किल है कि क्या चल रहा है। मुझे गलत करो जहां मैं गलत हूं। प्रत्येक नई लाइन के लिए awk चलाया जाता है? जाग स्रोत कोड में लूप के लिए कर रहा है: "लाइन में सभी टोकन के लिए"? तब यह प्रत्येक टोकन को संसाधित करता है?
ट्रेवर बॉयड स्मिथ

अक्खड़ क्षेत्र और रिकॉर्ड के संदर्भ में सोचते हैं। डिफ़ॉल्ट रूप से, रिकॉर्ड पाठ की लाइनें हैं और फ़ील्ड गैर-व्हाट्सएप हैं। एक awkस्क्रिप्ट में ब्लॉक का एक सेट ( {}शीर्ष स्तर पर सामान ) होता है। प्रत्येक ब्लॉक एक शर्त के साथ जुड़ा हुआ है - ऊपर मेरी पोस्ट में कोई भी नहीं है क्योंकि मैं हर इनपुट लाइन पर बिना शर्त कार्य करना चाहता हूं। Awk फ़ाइलों या मानक इनपुट से रिकॉर्ड पढ़ने के द्वारा संचालित होता है (इस मामले में यह STDIN b / c है कोई फ़ाइल नाम प्रदान नहीं किए गए थे), और उन्हें क्रम में प्रत्येक ब्लॉक के खिलाफ मिलान करते हुए, यदि स्थिति मेल खाती है, तो रिकॉर्ड पर ब्लॉक को निष्पादित करना।
jw013

2

प्रिंटफ का उपयोग करें:

printf "\e[%sm%s\e[00m\n" <some_number> <text_in_colour>

जैसे।

printf "\e[%sm%s\e[00m\n" 32 yodle

अंतिम \nन्यूलाइन वर्ण जोड़ता है।

कुछ करने की कोशिश के संभावित मूल्यों को देखने के लिए जैसे:

for i in {0..9} {30..38} {90..98} {100..108};
do
    printf "%d:\e[%sm%s\e[00m\n" $i "$i" yodle;
done

रंग के अलावा आप नंबर जोड़कर रंगीन पृष्ठभूमि के साथ बोल्ड या अंडरलाइन या रंगीन पाठ जैसे संशोधक जोड़ सकते हैं। उपयोग के माध्यम से रेखांकित और धारीदार पृष्ठभूमि के साथ नीला पाठ बनाने के लिए:

printf "\e[%sm%s\e[00m\n" "4;9;34;107" yodle

चीयर्स,

/ B2S


2

यदि आप BASH स्क्रिप्ट स्थापित करने में खुश हैं और ack, hhlighterपैकेज में उपयोगी डिफ़ॉल्ट रंग और एक आसान इंटरफ़ेस https://github.com/paoloantinori/hhighlighter है :

hhighlight उदाहरण

आप इसका उपयोग ऐसे कर सकते हैं जिससे शुरू होने वाली पंक्तियों को उजागर किया जा सके FAIL:

h -i 'FAIL.*'

या जिसमें शामिल हैं FAIL:

h -i '.*FAIL.*'

या विभिन्न सामान्य लॉग प्रविष्टियों के लिए:

h -i '.*FAIL.*' '.*PASS.*' '.*WARN.*'

और निश्चित रूप से, एक ही रंग (लाल) के लिए सादे grep के साथ:

$ printf 'Pass: good job\nFail: bad job\n' | grep -Ei --colour=auto '^|fail.*'

^हर पंक्ति से मेल खाता है, लेकिन एक विशेष मिलान है और पूरे लाइन प्रिंट करता है। हाइलाइट किए जाने वाले एक्सप्रेशन को ए के बाद परिभाषित किया गया है |। जब तक वे अलग होते हैं तब तक आगे के भाव जोड़े जा सकते हैं |

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.