How to change the output color without using echo?

Refresh

December 2018

Views

72 time

1

Is it possible to change the output color without using echo? Something like "set color to yellow".

I have a script

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

which prints the first line of file.txt in yellow and the second line in blue. But it also adds extra lines in the places where I have "echo" commands.

I tried something like this:

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

But it doesn't work because "echo" command needs -e parameter to display colors.

So my question is: Can I change the output color without using echo? If not, how to remove these extra lines between lines of the file? Is it possible to correct this script to not generate extra lines?

Current output:

 
first line of file.txt

second line of file.txt
 

Desirable output:

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

3 answers

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с цветами.

2
 echo -e -n "$YELLOW"

-n: Не добавить дополнительный символ новой строки

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 , чтобы избежать проблем при конвейере к другим программам.