Bash

你如何只為 bash 腳本的一些關鍵字著色?

  • July 4, 2018

我正在執行一些單元測試程式碼。單元測試程式碼輸出正常文本。有很多文字,所以我想為使用者突出顯示重要的關鍵字。

在這種情況下,關鍵字是“PASS”和“FAIL”。

您如何將“PASS”著色為綠色並將“FAIL”著色為紅色?

這是一個為正則表達式模式著色的通用腳本(可能需要一些修飾):

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

supercat似乎做你正在尋找的東西。

包裝:超級貓
描述-zh:為終端和 HTML 著色文本的程序
Supercat 是一個基於匹配正則著色文本的程序
表達式/字元串/字元。Supercat 也支持 html 輸出
作為標準 ASCII 文本。與一些文本著色程序不同,
存在,Supercat 不需要你必須是程序員才能
制定著色規則。
首頁:http://supercat.nosredna.net/

似乎沒有任何方法可以告訴它在命令行上著色什麼,您必須指定一個配置文件。

我似乎記得曾經有一個名為“hilite”或“hl”的程序突出顯示與模式匹配的文本(例如grep --colour,但也顯示不匹配的行),但是當我搜尋它時找不到它。

最後,GNUgrep可用於突出顯示模式——但只能使用一種顏色(即,您不能使用綠色的 PASS 和紅色的 FAIL,兩者都將用相同的顏色突出顯示)。

通過這樣的方式管道傳輸您的數據:

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

此範例使用 egrep (aka grep -E),但-G基本的正則表達式、-F固定字元串和-PPCRE 也可以使用。

所有比賽都將突出顯示。預設為紅色,或設置 GREP_COLOR 環境變數。

這項工作的關鍵是|$模式中的最終匹配行尾(即所有行匹配),因此將顯示所有行(但不著色)。

它們是字邊界標記,因此\b它匹配例如 FAIL 但不匹配 FAILURE。它們不是必需的,因此如果要匹配部分單詞,請刪除它們。

這是我昨天寫的 supercat 的範例包裝腳本。它可以工作,但在編寫它時,我發現 supercat 沒有任何不區分大小寫搜尋的選項。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"

引用自:https://unix.stackexchange.com/questions/46562