bash 스크립트의 일부 키워드 만 어떻게 채색합니까? 텍스트가 있으므로

단위 테스트 코드를 실행 중입니다. 단위 테스트 코드는 일반 텍스트를 출력합니다. 많은 텍스트가 있으므로 사용자에게 중요한 키워드를 강조하고 싶습니다.

이 경우 키워드는 “PASS”및 “FAIL”입니다.

“PASS”를 녹색으로, “FAIL”을 빨강으로 어떻게 채색합니까?



답변

supercat 당신이 찾고있는 것을하는 것 같습니다.

패키지 : 슈퍼 캣
Description-en : 터미널 및 HTML의 텍스트를 색칠하는 프로그램
 Supercat은 일치하는 규칙에 따라 텍스트를 채색하는 프로그램입니다
 표현식 / 문자열 / 문자. Supercat은 html 출력도 지원합니다
 표준 ASCII 텍스트로. 일부 텍스트 채색 프로그램과 달리
 Supercat은 프로그래머가 아니어도됩니다.
 착색 규칙을 만듭니다.
홈페이지 : http://supercat.nosredna.net/

커맨드 라인에서 무엇을 채색 할지를 알 수있는 방법이없는 것 같습니다. 설정 파일을 지정해야합니다.

패턴과 일치하는 텍스트를 강조 표시하는 (hilite) 또는 ‘hl’이라는 프로그램이 grep --colour있었지만 (예 를 들어 일치하지 않는 행도 표시) 프로그램을 검색했을 때 찾을 수 없었습니다.

마지막으로 GNU grep를 사용하여 패턴을 강조 할 수 있습니다. 단 하나의 색상 만 사용할 수 있습니다 (즉, 녹색으로 통과 및 빨간색으로 실패 할 수 없으며 둘 다 동일한 색상으로 강조 표시됨).

다음과 같이 데이터를 파이프하십시오.

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

이 예제는 egrep (aka grep -E)를 사용하지만 -G기본 정규 표현식, -F고정 문자열 및 -PPCRE도 작동합니다.

모든 경기가 강조 표시됩니다. 기본값은 빨간색이거나 GREP_COLOR env var를 설정합니다.

이 작업의 핵심 |$은 패턴 의 마지막 부분이 줄 끝과 일치하므로 모든 줄이 일치하므로 모든 줄이 표시되지만 색상이 표시되지는 않습니다.

\b이 예를 들어 FAIL하지만 실패 일치하도록 단어 경계 마커입니다. 그것들은 필요하지 않으므로 부분 단어와 일치 시키려면 제거하십시오.

다음은 어제 작성한 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"

답변

다음은 정규식 패턴을 채색하는 범용 스크립트입니다 (아마도 일부 수정이 필요함).

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

답변

대체 표현식에 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입니다.


답변

printf를 사용하십시오 :

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


답변

BASH 스크립트를 설치 ack하고 hhlighter패키지에 유용한 기본 색상과 편리한 인터페이스가 https://github.com/paoloantinori/hhighlighter :

이렇게 사용하여 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.*'

^모든 라인을 일치하지만 특별한 정규이며, 전체 라인을 인쇄합니다. 강조 표시 할 표현식은 다음에 정의됩니다 |. 로 구분되는 한 추가 표현식을 추가 할 수 있습니다 |.