일부 단위 테스트 코드를 실행 중입니다. 단위 테스트 코드는 일반 텍스트를 출력합니다. 텍스트가 많기 때문에 사용자에게 중요한 키워드를 강조하고 싶습니다.
이 예에서 키워드는 "PASS" 및 "FAIL"입니다.
"PASS"를 녹색으로, "FAIL"을 빨간색으로 표시하려면 어떻게 해야 합니까?
답변1
supercat
당신이 찾고있는 일을하고있는 것 같습니다.
포장: 슈퍼 고양이 Description-en: 터미널 및 HTML 텍스트 색상 지정 프로그램 Supercat은 일치하는 규칙에 따라 텍스트에 색상을 지정하는 프로그램입니다. 표현식/문자열/문자. Supercat은 HTML 출력도 지원합니다. 표준 ASCII 텍스트로. 일부 텍스트 색칠 프로그램과 달리 예, Supercat을 사용하려면 프로그래머가 필요하지 않습니다. 색칠 규칙을 개발하세요. 홈페이지: http://supercat.nosredna.net/
명령줄에서 무엇을 색칠할지 알려주는 방법은 없는 것 같습니다. 구성 파일을 지정해야 합니다.
패턴과 일치하는 텍스트를 강조 표시하는 "hilite" 또는 "hl"이라는 프로그램이 있었던 것으로 기억하는 것 같습니다(예: , grep --colour
일치하지 않는 행도 표시함). 검색해도 찾을 수 없습니다. 그것을 위해.
마지막으로 GNU는 grep
하이라이트 모드에서 사용할 수 있습니다. 하지만 한 가지 색상만 사용할 수 있습니다(예: PASS를 녹색으로, FAIL을 빨간색으로 설정할 수 없으며 둘 다 동일한 색상으로 강조 표시됩니다).
다음 방법으로 데이터를 전송하세요.
grep -E --color "\b(PASS|FAIL)\b|$"
이 예에서는 grep
확장 -E
정규식 옵션을 사용하지만 -G
기본 정규식, -F
고정 문자열 및 PCRE도 사용할 수 있습니다.-P
모든 일치 항목이 강조 표시됩니다. 기본값은 빨간색이거나 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"
답변2
다음은 정규식 패턴 색상을 지정하기 위한 일반 스크립트입니다(일부 다듬기가 필요할 수 있음).
#! /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
답변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
변수에 할당하는 것인데, 여기서는 options 을 사용하여 수행됩니다 -v
.
답변4
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.*'
모든 줄 과 일치 ^
하지만 특별한 일치자이며 전체 줄을 인쇄합니다. 강조표시할 표현식은 나중에 정의됩니다 |
. 구분된 식이라면 더 많은 표현식을 추가할 수 있습니다 |
.