printf에 색상 사용


90

다음과 같이 작성하면 텍스트가 파란색으로 출력됩니다.

printf "\e[1;34mThis is a blue text.\e[0m"

하지만 printf에 형식을 정의하고 싶습니다.

printf '%-6s' "This is text"

이제 색상을 추가하는 방법에 대한 몇 가지 옵션을 시도했지만 성공하지 못했습니다.

printf '%-6s' "\e[1;34mThis is text\e[0m"

나는 성공하지 못한 채 서식에 속성 코드를 추가하려고 시도했습니다. 이것은 작동하지 않으며 내 경우와 같이 형식을 정의한 printf에 색상이 추가되는 예를 찾을 수 없습니다.

답변:


79

부품을 깨끗하게 분리하는 대신 함께 혼합하는 것입니다.

printf '\e[1;34m%-6s\e[m' "This is text"

기본적으로 고정 된 항목은 형식에, 변수 항목은 매개 변수에 넣습니다.


당신의 answear에 감사드립니다. 몰랐습니다. 문자열 길이 형식은 색상 속성 사이에 넣어야합니다.
Jernej Jerin 2011 년

이 형식화 방법 (나에게 새로운 btw); 이 모든 것이 표준입니까?
Chani 2014

@Chani printf명령은 printf()C 언어의 기능을 모델 로합니다. 첫 번째 매개 변수 / 인수는 항상 format모든 형식 (그리고 색상도 포함)을 포함 하는 문자열이고 나머지 매개 변수는 데이터입니다. 특정 스타일로 텍스트를 출력하려면 모든 서식 및 색상 이스케이프를 서식 문자열에 넣는 것이 좋습니다. 형식 문자열은 신뢰할 수있는 것으로 간주되며 사용자 입력을 포함해서는 안됩니다.
Mikko Rantalainen

여기에 몇 가지 추가 세부 정보가 있습니다. 명령 printf형식 에 따라 인쇄 되는 형식 문자열인수 목록으로 구성됩니다. 색상은 format-string의 일부로 표시되므로 형식 문자열에 속해야합니다.
kvantour

177

구식 터미널 코드를 사용하는 대신 다음 대안을 제안 할 수 있습니다. 더 읽기 쉬운 코드를 제공 할뿐만 아니라 원래 의도 한대로 형식 지정자와 색상 정보를 별도로 유지할 수도 있습니다.

blue=$(tput setaf 4)
normal=$(tput sgr0)

printf "%40s\n" "${blue}This text is blue${normal}"

추가 색상은 여기 내 대답을 참조하십시오.


1
//, 이렇게하면 코드가 의미하는 바를 문서화 할 필요가 없습니다. 우리 그룹이 스크립트를 문서로 보는 것을 돕는 한 걸음 더 나아갈 것이라고 생각합니다.
Nathan Basanese

38

이것은 나를 위해 작동합니다.

printf "%b" "\e[1;34mThis is a blue text.\e[0m"

에서 printf(1):

%b     ARGUMENT as a string with '\' escapes interpreted, except that octal
       escapes are of the form \0 or \0NNN

printf "\ e [1; 34m 이것은 파란색 텍스트입니다. \ e [0m"은 저에게 똑같은 일을합니다.
PintoDoido

22

이것은 터미널에서 다른 색상을 얻는 작은 프로그램입니다.

#include <stdio.h>

#define KNRM  "\x1B[0m"
#define KRED  "\x1B[31m"
#define KGRN  "\x1B[32m"
#define KYEL  "\x1B[33m"
#define KBLU  "\x1B[34m"
#define KMAG  "\x1B[35m"
#define KCYN  "\x1B[36m"
#define KWHT  "\x1B[37m"

int main()
{
    printf("%sred\n", KRED);
    printf("%sgreen\n", KGRN);
    printf("%syellow\n", KYEL);
    printf("%sblue\n", KBLU);
    printf("%smagenta\n", KMAG);
    printf("%scyan\n", KCYN);
    printf("%swhite\n", KWHT);
    printf("%snormal\n", KNRM);

    return 0;
}

9
이것은 bash가 아니라 c입니다.
eav

14

이것은 bash 스크립팅을 사용하여 컬러 텍스트를 인쇄하는 작은 기능입니다. 원하는만큼 스타일을 추가 할 수 있으며 탭과 새 줄을 인쇄 할 수도 있습니다.

#!/bin/bash

# prints colored text
print_style () {

    if [ "$2" == "info" ] ; then
        COLOR="96m";
    elif [ "$2" == "success" ] ; then
        COLOR="92m";
    elif [ "$2" == "warning" ] ; then
        COLOR="93m";
    elif [ "$2" == "danger" ] ; then
        COLOR="91m";
    else #default color
        COLOR="0m";
    fi

    STARTCOLOR="\e[$COLOR";
    ENDCOLOR="\e[0m";

    printf "$STARTCOLOR%b$ENDCOLOR" "$1";
}

print_style "This is a green text " "success";
print_style "This is a yellow text " "warning";
print_style "This is a light blue with a \t tab " "info";
print_style "This is a red text with a \n new line " "danger";
print_style "This has no color";

2
StackOverflow에 게시 된 코드 재사용에 대한 정책은 무엇입니까?
Daisuke Aramaki

2
@DaisukeAramaki 물어봐 주셔서 감사합니다. 원하는 방식으로 어디에서나 사용할 수 있습니다. MIT 라이센스하에 있습니다. 당신이 공동 작업을하려면 요점에 개선을 제출하여 주시기 바랍니다 : gist.github.com/arianacosta/d6d1c521d231cc09ec5fe850ae2f5be1
아리안 아코 스타

5

컬러 쉘 출력을 인쇄하기 위해이 c 코드를 사용합니다. 코드는 게시물을 기반으로 합니다 .

//General Formatting
#define GEN_FORMAT_RESET                "0"
#define GEN_FORMAT_BRIGHT               "1"
#define GEN_FORMAT_DIM                  "2"
#define GEN_FORMAT_UNDERSCORE           "3"
#define GEN_FORMAT_BLINK                "4"
#define GEN_FORMAT_REVERSE              "5"
#define GEN_FORMAT_HIDDEN               "6"

//Foreground Colors
#define FOREGROUND_COL_BLACK            "30"
#define FOREGROUND_COL_RED              "31"
#define FOREGROUND_COL_GREEN            "32"
#define FOREGROUND_COL_YELLOW           "33"
#define FOREGROUND_COL_BLUE             "34"
#define FOREGROUND_COL_MAGENTA          "35"
#define FOREGROUND_COL_CYAN             "36"
#define FOREGROUND_COL_WHITE            "37"

//Background Colors
#define BACKGROUND_COL_BLACK            "40"
#define BACKGROUND_COL_RED              "41"
#define BACKGROUND_COL_GREEN            "42"
#define BACKGROUND_COL_YELLOW           "43"
#define BACKGROUND_COL_BLUE             "44"
#define BACKGROUND_COL_MAGENTA          "45"
#define BACKGROUND_COL_CYAN             "46"
#define BACKGROUND_COL_WHITE            "47"

#define SHELL_COLOR_ESCAPE_SEQ(X) "\x1b["X"m"
#define SHELL_FORMAT_RESET  ANSI_COLOR_ESCAPE_SEQ(GEN_FORMAT_RESET)

int main(int argc, char* argv[])
{
    //The long way
    fputs(SHELL_COLOR_ESCAPE_SEQ(GEN_FORMAT_DIM";"FOREGROUND_COL_YELLOW), stdout);
    fputs("Text in gold\n", stdout);
    fputs(SHELL_FORMAT_RESET, stdout);
    fputs("Text in default color\n", stdout);

    //The short way
    fputs(SHELL_COLOR_ESCAPE_SEQ(GEN_FORMAT_DIM";"FOREGROUND_COL_YELLOW)"Text in gold\n"SHELL_FORMAT_RESET"Text in default color\n", stdout);

    return 0;
}

2

man printf.1하단에 "... 쉘에 자체 버전이있을 수 있습니다."라는 메모가 있습니다 printf. 이 질문은 태그로 지정되어 bash있지만 가능하다면 모든 쉘에 이식 가능한 스크립트를 작성하려고합니다 . dash휴대 좋은 최소 기준은 보통 - 대답은 여기에서 작동하므로 bash, dash, zsh. 스크립트가 그 3에서 작동한다면 거의 모든 곳으로 이식 가능합니다.

의 최신 구현 printfdash[1] 주어진 색상 화 출력되지 않습니다 %s은 ANSI 이스케이프 문자와 형식 지정자 \e- 하지만, 형식 지정자 %b진수와 결합 \033(아스키에 상응하는 ESC) 작업이 완료 얻을 것이다. 이상치에 대해서는 주석을 달았지만 AFAIK, 모든 쉘은 printf최소한 ASCII 8 진 서브 세트를 사용하도록 구현 되었습니다.

"printf와 함께 색상 사용"이라는 질문의 제목에 대해 형식 지정 을 설정 하는 가장 이식 가능한 방법 %bprintf( @Vlad 의 이전 답변 에서 참조한) 형식 지정자를 8 진수 이스케이프와 결합하는 것 \033입니다.


portable-color.sh

#/bin/sh
P="\033["
BLUE=34
printf "-> This is %s %-6s %s text \n" $P"1;"$BLUE"m" "blue" $P"0m"
printf "-> This is %b %-6s %b text \n" $P"1;"$BLUE"m" "blue" $P"0m"

출력 :

$ ./portable-color.sh
-> This is \033[1;34m blue   \033[0m text
-> This is  blue    text

... 그리고 '파란색'은 두 번째 줄에서 파란색입니다.

%-6sOP 의 형식 지정자는 열기 및 닫기 제어 문자 시퀀스 사이의 형식 문자열 중간에 있습니다.


[1] 참조 : man dash섹션 "Builtins":: "printf":: "포맷"


-2
#include <stdio.h>

//fonts color
#define FBLACK      "\033[30;"
#define FRED        "\033[31;"
#define FGREEN      "\033[32;"
#define FYELLOW     "\033[33;"
#define FBLUE       "\033[34;"
#define FPURPLE     "\033[35;"
#define D_FGREEN    "\033[6;"
#define FWHITE      "\033[7;"
#define FCYAN       "\x1b[36m"

//background color
#define BBLACK      "40m"
#define BRED        "41m"
#define BGREEN      "42m"
#define BYELLOW     "43m"
#define BBLUE       "44m"
#define BPURPLE     "45m"
#define D_BGREEN    "46m"
#define BWHITE      "47m"

//end color
#define NONE        "\033[0m"

int main(int argc, char *argv[])
{
    printf(D_FGREEN BBLUE"Change color!\n"NONE);

    return 0;
}

2
질문에 관한 것입니다 printf와 강타,하지 C.에서
모든 노동자가 필수적이다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.