使用 printf 启动脚本时以不同颜色突出显示特定行

使用 printf 启动脚本时以不同颜色突出显示特定行

我正在使用 bash 脚本。启动脚本时,如何突出显示输出中的特定行?例如,所有带有“Enable”的行应为绿色,所有带有“Disable”的行应为红色,所有其他行应为黄色。如下所示:

当我运行它时,我使用:

YELLOW="\e[33m"
GREEN="\e[92m"
RED="\e[31m"
printf "${YELLOW}"
./config.sh --enable 1 2 3 4 5 --disable 6 7 8 9

这样,输出就是黄色。这样就没问题了,但是如何在启用和禁用行上使用不同的颜色呢?

输出如下所示:

Enable 1
Enable 2
Enable 3
Enable 4
Enable 5
Disable 6
Disable 7
Disable 8
Disable 9
aaaaaaaaaaa
bbbbbbbbbbb
ccccccccccc
ddddddddddd

然后,在所有带有启用的行变为绿色并且禁用的行变为红色之后,从aaaaaaaaa启用开始,之后的所有内容都应为默认的黄色。我该怎么做?

答案1

如果你坚持,printf你可以这样做:

highlight() {
  YELLOW="\e[;33m"
  GREEN="\e[;92m"
  RED="\e[;31m"
  while read -r; do
    case "$REPLY" in
      *Enable*)
        printf "$GREEN%s$YELLOW\n" "$REPLY"
        ;;
      *Disable*)
        printf "$RED%s$YELLOW\n" "$REPLY"
        ;;
      \[????\]*)
        printf "$YELLOW%s\e[m%s\n" "${REPLY:0:6}" "${REPLY:6}"
        ;;
      *)
        printf "$YELLOW%s\n" "$REPLY"
        ;;
    esac
    printf "$YELLOW"
  done
}

# ./config.sh --enable 1 2 3 4 5 --disable 6 7 8 9 |& highlight
highlight < <(setsid ./config.sh --enable 1 2 3 4 5 --disable 6 7 8 9 2>&1 </dev/null)

export CLICOLOR=0
highlight < <(setsid cmake --build ./path/to/build 2>&1 </dev/null)

示例输出

这只是读取每一行并在打印之前添加正确的颜色。它|&还会捕获 stderr。@rusty 的回答会更通用,但它使用 sed。重置、末尾$YELLOW和是setsid针对脚本中某些奇怪行为的许多解决方法./config.sh

答案2

它适用于百分比,但其他任何东西都是灰色的。但根据您的建议,我已设法使其适用于 cmake:

highlight() {
  YELLOW="\e[;93m"
  GREEN1="\e[;32m"
  GREEN2="\e[;92m"
  MAGENTA="\e[;95m"
  STOP="\e[0m"
  while read -r; do
    case "$REPLY" in
      *NEON*)
        printf "$GREEN2%s$YELLOW\n" "$REPLY"
        ;;
      *Scanning*)
        printf "$MAGENTA%s$YELLOW\n" "$REPLY"
        ;;
      \[????\]*Building*)
        printf "$YELLOW%s\e[$GREEN1%s\n" "${REPLY:0:6}" "${REPLY:6}"
        ;;
      \[????\]*Linking*)
        printf "$YELLOW%s\e[$GREEN2%s\n" "${REPLY:0:6}" "${REPLY:6}"
        ;;
      *)
        printf "$YELLOW%s\n" "$REPLY"
        ;;
    esac
done
  printf "$STOP"
}

这样,cmake 就可以通过 printf 获得所有默认颜色。百分比(默认为灰色)现在变为黄色,百分比后的构建线也变为黄色(默认为灰色)。cmake 输出的任何其他内容都具有颜色,而没有 printf 时 cmake 也具有这些颜色。感谢您的帮助 :)

另一个具有启用和禁用功能的按钮用于其他用途,不适用于 cmake。

相关内容