Bir bash betiği için yalnızca bazı anahtar kelimeleri nasıl renklendirirsiniz?


10

Bazı birim test kodları çalıştırıyorum. Birim test kodu normal metin verir. Metin önemli bir çok kullanıcı önemli anahtar kelimeler için vurgulamak istiyorum.

Bu durumda, anahtar kelimeler "PASS" ve "FAIL" olur.

"GEÇİŞ" i yeşil ve "BAŞARISIZ" renklerini kırmızı olarak nasıl renklendirirsiniz?


Geçen testlerin stdout / stderr'ını bastırmayı ve başarısız testler için sadece stdout / stderr'ı yazdırmayı düşündünüz mü? PHPUnit bunu yapar veya bunu yapmak için yapılandırılabilir. Bu yaklaşımın gayet iyi işlediğini gördüm, YMMV.
Clayton Stanley

Yanıtlar:


8

supercat aradığınızı yapıyor gibi görünüyor.

Paket: supercat
Description-tr: terminaller ve HTML için metni renklendiren program
 Supercat, düzenli olarak eşleştirmeye dayalı olarak metni renklendiren bir programdır.
 ifadeleri / dizeleri / karakter. Supercat html çıktısını da destekler
 standart ASCII metni olarak. Bazı metin renklendirme programlarının aksine
 Supercat, programcı olmanızı gerektirmez
 renklendirme kuralları yapabilir.
Ana Sayfa: http://supercat.nosredna.net/

Komut satırında ne renklendirileceğini söylemenin bir yolu yok gibi görünüyor, bir yapılandırma dosyası belirtmelisiniz.

Bir desenle eşleşen metnin vurgulandığı 'hilite' veya 'hl' adlı bir program olduğunu hatırlıyorum ( grep --coloureşleşmeyen satırları da görüntülüyor gibi ), ancak aradığımda bulamadım.

Son olarak, GNU grepdesenleri vurgulamak için kullanılabilir - ancak yalnızca bir renk kullanılabilir (yani yeşil renkte PASS ve kırmızı renkte BAŞARISIZ olamaz, her ikisi de aynı renkle vurgulanır).

Verilerinizi aşağıdaki gibi bir şeye aktarın:

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

Bu örnek egrep (aka grep -E) kullanır , ancak -Gtemel regexp, -Fsabit dize ve -PPCRE de çalışır.

Tüm maçlar vurgulanacaktır. Varsayılan kırmızıdır veya GREP_COLOR env var.

Bu çalışmanın anahtarı |$, desendeki finalin satır sonu ile eşleşmesidir (yani tüm satırlar eşleşir), böylece tüm satırlar görüntülenir (ancak renklendirilmez).

\bO örn FAIL ancak FAILURE eşleşecek şekilde sözcük sınırlama göstergelerdir. bunlar gerekli değildir, bu nedenle kısmi kelimeleri eşleştirmek istiyorsanız bunları kaldırın.

İşte dün yazdığım supercat için örnek sarıcı komut dosyası. Çalışıyor, ancak yazarken, supercat'in büyük / küçük harfe duyarlı olmayan aramalar için herhangi bir seçeneği olmadığını keşfettim. IMO, programı önemli ölçüde daha az kullanışlı hale getirir. Ancak, '-i' seçeneği yazmak zorunda olmadığım için komut dosyasını büyük ölçüde basitleştirdi :)

#! /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, kullandıysanız supercat, komut satırı bağımsız değişkenlerini temel alarak geçici bir yapılandırma dosyası oluşturmak için gönderdiğiniz komut dosyasını değiştirebilir ve çağırabilirsiniz spc -c /path/to/your/temp/config. Bu, komut satırında farklı desenler için farklı renkler kolayca belirtmenize olanak tanır.
cas

Ayrıca btw, bunu yapmak için basit bir sarıcı komut dosyası yazdı. şimdi çalışmak için kafa var ama ben temizlemek, bazı yorumlar, eklemek ve bugün daha sonra sonrası.
cas

5

Normal ifade kalıplarını renklendirmek için genel amaçlı bir komut dosyası (muhtemelen bazı rötuşlar gerekir):

#! /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"

Ad verin hilite.shve şu şekilde kullanın:

$ ./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

Bunu yaptım community wikiçünkü çözümüm işe yaramıyor.
Trevor Boyd Smith

Test etmenin kolay bir yolu, metni "PASS" ve "FAIL" anahtar kelimeleriyle yansıtan başka bir komut dosyası oluşturmaktır. Bu daha sonra bu komut dosyası tarafından çağrılır.
Trevor Boyd Smith

Biraz konu dışı, ama komut yerine ikame $BINyoluyla çıktı ayrıştırma evalmuhtemelen kırılgan, hantal ve düpedüz tehlikeli olduğunu belirtmek gerekir . STDOUT bir akıştır ve genellikle akış benzeri araçlar tarafından işlenmesi amaçlanır. Bir değişkendeki tüm akışı yakalamaya çalışmak çok verimli değildir. Ayrıca, evaltehlikeli derecede güçlüdür , bu yüzden sadece ne yaptığınızı gerçekten biliyorsanız kullanın.
jw013

Senaryoyu çalışan bir kodla değiştirdim.
angus

@angus, gerçekten çok iyi ve etkileyici script IMO.
Trevor Boyd Smith

3

İfadelerin yerine rastgele dizeler ( tputçıktı gibi ) gömmek sedsorunludur, çünkü dizenin geçerli bir sedsözdizimi olduğundan emin olmanız gerekir . Onun awkyerine kullanırdım. Örnek olarak:

{ 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 
      }}'

Anahtar, burada seçenekler kullanılarak yapılan değişkenlere tputdiziler atamaktır .awk-v


Programınızı çalıştırdım ve gerekli olanı yapıyor. Huzzah! Ama ne yazık ki ben garip bir guru değilim, bu yüzden neler olduğunu anlamakta zorlanıyorum. Beni yanıldığım yerde düzelt. Her yeni satır için awk çalıştırılır mı? Awk kaynak kodundaki for döngüsü yapıyor: "satırındaki tüm belirteçler için"? sonra her jetonu işler mi?
Trevor Boyd Smith

Awk alanlar ve kayıtlar açısından düşünüyor. Varsayılan olarak, kayıtlar metin satırlarıdır ve alanlar boşluk değildir. Bir awkkomut dosyası bir dizi bloktan oluşur ( {}üst düzeydeki öğeler ). Her blok bir koşulla ilişkilidir - yukarıdaki yazımda hiçbiri yoktur çünkü her girdi satırında koşulsuz hareket etmek istiyorum. Awk, dosyalardan veya standart girdilerden kayıtları okuyarak (bu durumda STDIN b / c dosya adı verilmez) ve koşul eşleşirse kayıttaki bloğu yürüterek sırayla her blokla eşleştirerek çalışır.
jw013

2

printf kullanın:

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

Örneğin.

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

sonuncusu \nyeni satır karakterini ekler.

Olası bir denemenin olası değerlerini görmek için:

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

rengin yanı sıra, sayıları birleştirerek renkli arka plana sahip kalın veya altı çizili veya renkli metin gibi değiştiriciler ekleyebilirsiniz. Kullanım sırasında altı çizili ve üstü çizili gri arka planı olan mavi metin oluşturmak için:

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

Alkış,

/ B2S


2

Eğer bir BASH komut dosyası yüklemek ve mutlu iseniz ack, hhlighterpaket kullanışlı varsayılan renkler ve kolay bir arayüze sahip https://github.com/paoloantinori/hhighlighter :

hhighlight örneği

Şununla başlayan satırları vurgulamak için bunu kullanabilirsiniz FAIL:

h -i 'FAIL.*'

veya aşağıdakileri içeren FAIL:

h -i '.*FAIL.*'

veya çeşitli ortak günlük girişleri için:

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

Ve elbette, düz grep ile tek bir renk (kırmızı) için:

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

^Her satırı ile eşleşir, ancak özel bir eşleştirici ve bütün satırı yazdırır. Vurgulanacak ifade a |. Ayrıldıkları sürece başka ifadeler eklenebilir |.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.