Как изменить цвет вывода эха в Linux - PullRequest
1458 голосов
/ 10 мая 2011

Я пытаюсь напечатать текст в терминале с помощью команды echo.

Я хочу напечатать текст красным цветом.Как я могу это сделать?

Ответы [ 24 ]

13 голосов
/ 28 апреля 2017

Спасибо @ k-пять за этот ответ

declare -A colors
#curl www.bunlongheng.com/code/colors.png

# Reset
colors[Color_Off]='\033[0m'       # Text Reset

# Regular Colors
colors[Black]='\033[0;30m'        # Black
colors[Red]='\033[0;31m'          # Red
colors[Green]='\033[0;32m'        # Green
colors[Yellow]='\033[0;33m'       # Yellow
colors[Blue]='\033[0;34m'         # Blue
colors[Purple]='\033[0;35m'       # Purple
colors[Cyan]='\033[0;36m'         # Cyan
colors[White]='\033[0;37m'        # White

# Bold
colors[BBlack]='\033[1;30m'       # Black
colors[BRed]='\033[1;31m'         # Red
colors[BGreen]='\033[1;32m'       # Green
colors[BYellow]='\033[1;33m'      # Yellow
colors[BBlue]='\033[1;34m'        # Blue
colors[BPurple]='\033[1;35m'      # Purple
colors[BCyan]='\033[1;36m'        # Cyan
colors[BWhite]='\033[1;37m'       # White

# Underline
colors[UBlack]='\033[4;30m'       # Black
colors[URed]='\033[4;31m'         # Red
colors[UGreen]='\033[4;32m'       # Green
colors[UYellow]='\033[4;33m'      # Yellow
colors[UBlue]='\033[4;34m'        # Blue
colors[UPurple]='\033[4;35m'      # Purple
colors[UCyan]='\033[4;36m'        # Cyan
colors[UWhite]='\033[4;37m'       # White

# Background
colors[On_Black]='\033[40m'       # Black
colors[On_Red]='\033[41m'         # Red
colors[On_Green]='\033[42m'       # Green
colors[On_Yellow]='\033[43m'      # Yellow
colors[On_Blue]='\033[44m'        # Blue
colors[On_Purple]='\033[45m'      # Purple
colors[On_Cyan]='\033[46m'        # Cyan
colors[On_White]='\033[47m'       # White

# High Intensity
colors[IBlack]='\033[0;90m'       # Black
colors[IRed]='\033[0;91m'         # Red
colors[IGreen]='\033[0;92m'       # Green
colors[IYellow]='\033[0;93m'      # Yellow
colors[IBlue]='\033[0;94m'        # Blue
colors[IPurple]='\033[0;95m'      # Purple
colors[ICyan]='\033[0;96m'        # Cyan
colors[IWhite]='\033[0;97m'       # White

# Bold High Intensity
colors[BIBlack]='\033[1;90m'      # Black
colors[BIRed]='\033[1;91m'        # Red
colors[BIGreen]='\033[1;92m'      # Green
colors[BIYellow]='\033[1;93m'     # Yellow
colors[BIBlue]='\033[1;94m'       # Blue
colors[BIPurple]='\033[1;95m'     # Purple
colors[BICyan]='\033[1;96m'       # Cyan
colors[BIWhite]='\033[1;97m'      # White

# High Intensity backgrounds
colors[On_IBlack]='\033[0;100m'   # Black
colors[On_IRed]='\033[0;101m'     # Red
colors[On_IGreen]='\033[0;102m'   # Green
colors[On_IYellow]='\033[0;103m'  # Yellow
colors[On_IBlue]='\033[0;104m'    # Blue
colors[On_IPurple]='\033[0;105m'  # Purple
colors[On_ICyan]='\033[0;106m'    # Cyan
colors[On_IWhite]='\033[0;107m'   # White


color=${colors[$input_color]}
white=${colors[White]}
# echo $white



for i in "${!colors[@]}"
do
  echo -e "$i = ${colors[$i]}I love you$white"
done

Результат

enter image description here

Надеюсь, что это изображение поможет вам выбрать цвет для вашего удара: D

12 голосов
/ 05 сентября 2014

Эти коды работают на моем Ubuntu box:

enter image description here

echo -e "\x1B[31m foobar \x1B[0m"
echo -e "\x1B[32m foobar \x1B[0m"
echo -e "\x1B[96m foobar \x1B[0m"
echo -e "\x1B[01;96m foobar \x1B[0m"
echo -e "\x1B[01;95m foobar \x1B[0m"
echo -e "\x1B[01;94m foobar \x1B[0m"
echo -e "\x1B[01;93m foobar \x1B[0m"
echo -e "\x1B[01;91m foobar \x1B[0m"
echo -e "\x1B[01;90m foobar \x1B[0m"
echo -e "\x1B[01;89m foobar \x1B[0m"
echo -e "\x1B[01;36m foobar \x1B[0m"

Это печатает буквы a b c d все в разных цветах:

echo -e "\x1B[0;93m a \x1B[0m b \x1B[0;92m c \x1B[0;93m d \x1B[0;94m"

Для цикла:

for (( i = 0; i < 17; i++ )); 
do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; 
done

enter image description here

10 голосов
/ 05 июля 2014

для удобства чтения

Если вы хотите улучшить читаемость кода, вы можете сначала echo строку, а затем добавить цвет, используя sed:

echo 'Hello World!' | sed $'s/World/\e[1m&\e[0m/' 
8 голосов
/ 24 января 2017

Мой любимый ответ пока цветной Echo.

Просто, чтобы опубликовать другой вариант, вы можете проверить этот маленький инструмент xcol

https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/

вы используете его точно так же, как grep, и он будет окрашивать свой stdin другим цветом для каждого аргумента, например

sudo netstat -putan | xcol httpd sshd dnsmasq pulseaudio conky tor Telegram firefox "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+" ":[[:digit:]]+" "tcp." "udp." LISTEN ESTABLISHED TIME_WAIT

xcol example

Обратите внимание, что он принимает любое регулярное выражение, которое будет принимать sed.

Этот инструмент использует следующие определения

#normal=$(tput sgr0)                      # normal text
normal=$'\e[0m'                           # (works better sometimes)
bold=$(tput bold)                         # make colors bold/bright
red="$bold$(tput setaf 1)"                # bright red text
green=$(tput setaf 2)                     # dim green text
fawn=$(tput setaf 3); beige="$fawn"       # dark yellow text
yellow="$bold$fawn"                       # bright yellow text
darkblue=$(tput setaf 4)                  # dim blue text
blue="$bold$darkblue"                     # bright blue text
purple=$(tput setaf 5); magenta="$purple" # magenta text
pink="$bold$purple"                       # bright magenta text
darkcyan=$(tput setaf 6)                  # dim cyan text
cyan="$bold$darkcyan"                     # bright cyan text
gray=$(tput setaf 7)                      # dim white text
darkgray="$bold"$(tput setaf 0)           # bold black = dark gray text
white="$bold$gray"                        # bright white text

Я использую эти переменные в своих скриптах примерно так

echo "${red}hello ${yellow}this is ${green}coloured${normal}"
6 голосов
/ 23 сентября 2015

Чтобы расширить на этот ответ , для ленивых из нас:

function echocolor() { # $1 = string
    COLOR='\033[1;33m'
    NC='\033[0m'
    printf "${COLOR}$1${NC}\n"
}

echo "This won't be colored"
echocolor "This will be colorful"
5 голосов
/ 21 января 2018

Никто не заметил полезности кода ANSI 7 обратное видео .

Он остается читаемым на любых цветах схем терминалов, черном или белом фоне или других модных палитрах, меняя цвета переднего плана и фона.

Пример, для красного фона, который работает везде:

echo -e "\033[31;7mHello world\e[0m";

Вот так выглядит при изменении встроенных схем терминала:

enter image description here

Это скрипт цикла, используемый для GIF.

for i in {30..49};do echo -e "\033[$i;7mReversed color code $i\e[0m Hello world!";done

См. https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters

4 голосов
/ 23 апреля 2018

Вы должны определенно использовать tput для необработанных управляющих последовательностей ANSI.

Поскольку существует большое количество различных терминалов управления Языки, как правило, система имеет промежуточный уровень общения. Реальные коды ищутся в базе данных для текущих обнаруженных тип терминала, и вы даете стандартизированные запросы к API или (из оболочка) к команде.

Одной из этих команд является tput. tput принимает набор аббревиатур, называемых имена возможностей и любые параметры, если это уместно, затем ищет правильные escape-последовательности для обнаруженного терминала в terminfo базы данных и печатает правильные коды (терминал, мы надеемся, понимает).

из http://wiki.bash -hackers.org / scripting / терминальные коды

Тем не менее, я написал небольшую вспомогательную библиотеку под названием bash-tint , которая добавляет еще один слой поверх tput, что делает его еще более простым в использовании (imho):

Пример: tint "white(Cyan(T)Magenta(I)Yellow(N)Black(T)) is bold(really) easy to use."

даст следующий результат: enter image description here

3 голосов
/ 04 февраля 2017

И это то, что я использовал, чтобы увидеть все комбинации и решить, что читать круто:

for (( i = 0; i < 8; i++ )); do
    for (( j = 0; j < 8; j++ )); do
        printf "$(tput setab $i)$(tput setaf $j)(b=$i, f=$j)$(tput sgr0)\n"
    done
done
3 голосов
/ 19 февраля 2017

Я написал swag для достижения этой цели.

Вы можете просто сделать

pip install swag

Теперь вы можете установить все escape-команды в виде txt-файлов.в данный пункт назначения с помощью:

swag install -d <colorsdir>

Или еще проще с помощью:

swag install

, который установит цвета на ~/.colors.

Либо вы используете их какэто:

echo $(cat ~/.colors/blue.txt) This will be blue

Или этот способ, который я считаю на самом деле более интересным:

swag print -c red -t underline "I will turn red and be underlined"

Проверьте это на asciinema !

0 голосов
/ 06 марта 2019

См .:

echo_red(){
    echo -e "\e[1;31m$1\e[0m"
}
echo_green(){
    echo -e "\e[1;32m$1\e[0m"
}
echo_yellow(){
    echo -e "\e[1;33m$1\e[0m"
}
echo_blue(){
    echo -e "\e[1;34m$1\e[0m"
}
...