如何在不使用echo的情况下更改输出颜色?

时间:2018-01-18 15:02:36

标签: linux bash shell

是否可以在不使用echo的情况下更改输出颜色? 像“将颜色设置为黄色”之类的东西。

我有一个脚本

#!/bin/bash
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo -e ${YELLOW}
cat file.txt | awk 'NR==1 { print $0; }'
echo -e ${BLUE}
cat file.txt | awk 'NR==2 { print $0; }'
echo -e ${NC}

以黄色打印第一行file.txt,第二行以蓝色打印。但它也在我有“echo”命令的地方增加了额外的行。

我试过这样的事情:

#!/bin/bash
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

${YELLOW} cat file.txt | awk 'NR==1 { print $0; }'
${BLUE} cat file.txt | awk 'NR==2 { print $0; }' ${NC}

但它不起作用,因为“echo”命令需要-e参数来显示颜色。

所以我的问题是:我可以在不使用echo的情况下更改输出颜色吗?如果没有,如何删除文件行之间的这些额外行?是否可以更正此脚本以不生成额外的行?

当前输出:

 
first line of file.txt

second line of file.txt
 

理想的输出:

first line of file.txt
second line of file.txt

3 个答案:

答案 0 :(得分:2)

使用printf

 printf '\e[1;34m%-6s\e[m' "First line of text in BLUE"
 printf '\e[1;31m%-6s\n\e[m' "Second line of text in RED WITH A NEW LINE"

这是一个很小的bash功能:

$ cat col.sh
#!/bin/bash

colprint()
{
    printf '\e[1;%dm%-6s\n\e[m' "$1" "$2"
}

# For your input file.
colprint 31 "$(awk 'NR==1{print;}' file.txt)"
colprint 34 "$(awk 'NR==2{print;}' file.txt)"
colprint 33 "$(awk 'NR==3{print;}' file.txt)"

当然在xterm上用颜色输出颜色。

答案 1 :(得分:2)

 echo -e -n "$YELLOW"

-n:不添加额外的换行符

答案 2 :(得分:2)

使用tput

#!/bin/bash

yellow() { tput setaf 3; }
blue() { tput setaf 4; }
nc() { tput sgr0; }

[[ -t 1 ]] || export TERM=dumb

yellow
cat file.txt | awk 'NR==1 { print $0; }'
blue
cat file.txt | awk 'NR==2 { print $0; }'
nc

这样您就不必硬编码终端代码,终端类型和功能将得到尊重。例如,如果您使用的终端不支持颜色,那么您将获得未着色的文本而不是垃圾。

这里,当stdout不是终端时,使用相同的功能来获取未着色的文本,这是规范的Unix行为,以避免在管道到其他程序时出现问题。