이 글에서는 리눅스 터미널에서 서식이 적용된(formatted) 텍스트를 출력하는 방법을 알아봅니다. 서식을 활용하면 텍스트의 색상, 스타일은 물론 깜빡임이나 반전 같은 특수 효과까지 자유롭게 지정할 수 있습니다.
ANSI 이스케이프 시퀀스란?
리눅스 터미널은 ANSI 이스케이프 시퀀스(escape sequence)를 지원하여 텍스트의 서식, 색상 등 다양한 속성을 제어합니다. 원리는 간단합니다. 출력하려는 텍스트에 특정 제어 바이트를 함께 삽입하면, 터미널이 이를 해석하는 순간 해당 서식이 화면에 반영되는 것입니다.
ANSI 이스케이프 시퀀스의 일반적인 문법은 다음과 같습니다.
\x1b[A;B;C
- A : 텍스트 서식 스타일(Text Formatting Style)
- B : 전경색(Foreground Color), 즉 글자색
- C : 배경색(Background Color)
A, B, C 자리에는 아래와 같이 미리 정의된 값들이 사용됩니다.
텍스트 서식 스타일 (A 값)
| 값 | 스타일 |
|---|---|
| 1 | 굵게(Bold) |
| 2 | 흐리게(Faint) |
| 3 | 기울임(Italic) |
| 4 | 밑줄(Underline) |
| 5 | 느린 깜빡임(Blinking) |
| 6 | 빠른 깜빡임(Fast Blinking) |
| 7 | 색상 반전(Reverse) |
| 8 | 숨김(Hide) |
| 9 | 취소선(Strikethrough) |
색상 코드 (B 값 / C 값)
B는 글자색(전경색), C는 배경색에 해당하며, 각 색상마다 대응되는 코드가 정해져 있습니다.
| 전경색(B) | 배경색(C) | 색상 |
|---|---|---|
| 30 | 40 | 검정(Black) |
| 31 | 41 | 빨강(Red) |
| 32 | 42 | 초록(Green) |
| 33 | 43 | 노랑(Yellow) |
| 34 | 44 | 파랑(Blue) |
| 35 | 45 | 마젠타(Magenta) |
| 36 | 46 | 시안(Cyan) |
| 37 | 47 | 흰색(White) |
규칙을 잘 보면 전경색은 30번대, 배경색은 40번대로 시작한다는 점을 알 수 있습니다. 이 규칙만 기억하면 별도의 표 없이도 코드를 쉽게 작성할 수 있습니다.
예제 코드
아래는 위 규칙을 활용해 터미널 서식을 손쉽게 관리할 수 있도록 만든 Python 클래스입니다.
class Terminal_Format:
Color_Code = {'black': 0, 'red': 1, 'green': 2, 'yellow': 3,
'blue': 4, 'magenta': 5, 'cyan': 6, 'white': 7}
Format_Code = {'bold': 1, 'faint': 2, 'italic': 3, 'underline': 4,
'blinking': 5, 'fast_blinking': 6, 'reverse': 7,
'hide': 8, 'strikethrough': 9}
def __init__(self): # 객체 생성 시 터미널 스타일을 먼저 초기화
self.reset_terminal()
def reset_terminal(self): # 모든 속성을 초기 상태로 되돌림
self.property = {'text_style': None, 'fg_color': None, 'bg_color': None}
return self
def config(self, style=None, fg_col=None, bg_col=None): # 서식 일괄 설정
return self.reset_terminal().text_style(style).foreground(fg_col).background(bg_col)
def text_style(self, style): # 텍스트 스타일 설정
if style in self.Format_Code.keys():
self.property['text_style'] = self.Format_Code[style]
return self
def foreground(self, fg_col): # 전경색(글자색) 설정
if fg_col in self.Color_Code.keys():
self.property['fg_color'] = 30 + self.Color_Code[fg_col]
return self
def background(self, bg_col): # 배경색 설정
if bg_col in self.Color_Code.keys():
self.property['bg_color'] = 40 + self.Color_Code[bg_col]
return self
def format_terminal(self, string):
temp = [self.property['text_style'],
self.property['fg_color'],
self.property['bg_color']]
temp = [str(x) for x in temp if x is not None]
# 서식이 적용된 문자열 반환
return '\x1b[%sm%s\x1b[0m' % (';'.join(temp), string) if temp else string
def output(self, my_str):
print(self.format_terminal(my_str))
실행 결과

사용 방법
스크립트를 실행하려면 먼저 터미널에서 Python 셸을 연 뒤, 작성해 둔 스크립트 파일에서 클래스를 임포트합니다.
클래스의 객체를 생성한 후에는 원하는 결과에 맞게 서식을 구성(configure)해야 합니다. 터미널 설정을 변경하고 싶을 때마다 config() 함수를 호출해 스타일, 전경색, 배경색을 새로 지정하면 됩니다.
예를 들어 다음과 같이 사용할 수 있습니다.
term = Terminal_Format()
term.config(style='bold', fg_col='red', bg_col='white')
term.output('안녕하세요, 터미널!') # 굵은 빨간 글씨 + 흰 배경으로 출력됨
출력 직후에는 항상 \x1b[0m(리셋 코드)이 붙어 서식이 이후 출력물로 번지지 않으므로, 여러 번 출력해도 안전하게 사용할 수 있다는 점도 참고하시기 바랍니다.