我对 Bash 脚本还不太熟悉,我想知道是否有一个程序或内置命令可以通过管道以指定的颜色进行打印?或者是否有 echo 参数可以执行此操作?
就像我可以做的:
echo Hi | commandhere -arguement blue
并且它会用蓝色打印“Hi”吗?
答案1
我不知道有任何用于彩色打印的实用程序,但你可以使用如下 shell 函数轻松地完成它:
# colorize stdin according to parameter passed (GREEN, CYAN, BLUE, YELLOW)
colorize(){
GREEN="\033[0;32m"
CYAN="\033[0;36m"
GRAY="\033[0;37m"
BLUE="\033[0;34m"
YELLOW="\033[0;33m"
NORMAL="\033[m"
color=\$${1:-NORMAL}
# activate color passed as argument
echo -ne "`eval echo ${color}`"
# read stdin (pipe) and print from it:
cat
# Note: if instead of reading from the pipe, you wanted to print
# the additional parameters of the function, you could do:
# shift; echo $*
# back to normal (no color)
echo -ne "${NORMAL}"
}
echo hi | colorize GREEN
如果您想查看其他颜色,请查看此列表。您可以从那里添加对任何颜色的支持,只需在此函数中创建一个具有正确名称和值的附加变量即可。
答案2
我创建了这个函数并在 Bash 脚本中使用。
# 以指定颜色回显的函数 echoincolor(){ 案例 $1 “红色”)tput setaf 1;; “绿色”)tput setaf 2;; “橙色”)tput setaf 3;; “蓝色”)tput setaf 4;; “紫色”)tput setaf 5;; “青色”)tput setaf 6;; “灰色”|“灰色”)tput setaf 7;; “白色”)tput setaf 8;; 埃萨克 回声“$2”; 输入 sgr0 }
然后我就像这样称呼它echoincolor green "This text is in green!"
或者, 使用printf
# 以指定颜色打印的函数 colorprintf(){ 案例 $1 “红色”)tput setaf 1;; “绿色”)tput setaf 2;; “橙色”)tput setaf 3;; “蓝色”)tput setaf 4;; “紫色”)tput setaf 5;; “青色”)tput setaf 6;; “灰色”|“灰色”)tput setaf 7;; “白色”)tput setaf 8;; 埃萨克 打印“$2”; 输入 sgr0 }
然后像这样调用colorprintf green "This text is in green!"
笔记,echo
提供了尾随换行符,而 则printf
没有。
答案3
我使用这个旧脚本,名为 hilite.pl,取自网络,已经带有“未知作者”字样!
#!/usr/bin/perl -w
### Usage: hilite <ansi command> <target string>
### Purpose: Will read text from standard input and perform specified highlighting
### command before displaying text to standard output.
### License: GNU GPL
# unknown author
$|=1; # don't buffer i/o
$command = "$ARGV[0]";
$target = "$ARGV[1]";
$color = "\e[" . $command . "m";
$end = "\e[0m";
while(<STDIN>) {
s/($target)/$color$1$end/;
print $_;
}
然后我可以在管道中使用它,使用正则表达式/PCRE“高亮”日志输出或其他东西:
echo 'hello color world!!' | hilite.pl 34 "[Hh]el[^ ]*" | hilite.pl 43 .orld | hilite.pl 32 "\scolor\s"
这将用蓝色绘制 hello,用绿色绘制 color,用黄色绘制 world
您可以查看颜色列表(如果需要,您可以将 bash 表达式扩展为 {01..255}):
for i in {01..10} {30..49} {90..110} ; do echo $i | hilite.pl $i $i ; done
答案4
我在尝试做与原帖类似的事情时偶然发现了这个问题/答案。我找到了一些其他有用的资源,并根据这些资源想出了一个日志脚本。发布在这里,希望它能对其他人有所帮助。
深入研究链接有助于理解一些重定向,我不会尝试解释,因为我自己才刚刚开始理解它。
使用方法将彩色输出呈现到控制台,同时从进入日志文件的文本中删除颜色代码。它还将在日志文件中包含任何不起作用的命令的 stderr。
编辑:在底部添加更多用法以显示如何以不同的方式登录
#!/bin/bash
set -e
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
. $DIR/dev.conf
. $DIR/colors.cfg
filename=$(basename ${BASH_SOURCE[0]})
# remove extension
# filename=`echo $filename | grep -oP '.*?(?=\.)'`
filename=`echo $filename | awk -F\. '{print $1}'`
log=$DIR/logs/$filename-$target
if [ -f $log ]; then
cp $log "$log.bak"
fi
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>$log 2>&1
# log message
log(){
local m="$@"
echo -e "*** ${m} ***" >&3
echo "=================================================================================" >&3
local r="$@"
echo "================================================================================="
echo -e "*** $r ***" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"
echo "================================================================================="
}
echo "=================================================================================" >&3
log "${Cyan}The ${Yellow}${COMPOSE_PROJECT_NAME} ${filename} ${Cyan}script has been executed${NC}"
log $(ls) #log $(<command>)
log "${Green}Apply tag to image $source with version $version${NC}"
# log $(exec docker tag $source $target 3>&2) #prints error only to console
# log $(docker tag $source $target 2>&1) #prints error to both but doesn't exit on fail
log $(docker tag $source $target 2>&1) && exit $? #prints error to both AND exits on fail
# docker tag $source $target 2>&1 | tee $log # prints gibberish to log
echo $? # prints 0 because log function was successful
log "${Purple}Push $target to acr${NC}"
以下是其他有帮助的链接:
- https://stackoverflow.com/questions/6744006/can-i-use-sed-to-manipulate-a-variable-in-bash
- https://www.cyberciti.biz/faq/redirecting-stderr-to-stdout/
- https://unix.stackexchange.com/questions/42728/what-does-31-12-23-do-in-a-script
- https://serverfault.com/questions/103501/how-can-i-fully-log-all-bash-scripts-actions
- https://www.gnu.org/software/bash/manual/bash.html#Redirections