[Linux] top command 출력 결과에 특수 문자 추가되는 현상
top 명령어를 스크립트에서 사용할 때 특수 문자가 포함되는 현상에 대한 원인과 해결 방안에 대해서 다룹니다.
문제
top
명령어는 시스템 성능을 실시간으로 모니터링할 수 있는 유용한 도구입니다. 이를 스크립트에서 사용해 결과를 파일로 저장하고 후속 분석에 활용하는 경우가 많습니다.
하지만 아래처럼 top
명령 결과를 grep
으로 필터링해 파일로 저장한 뒤, vim
편집기로 열어보면 특수 문자가 섞여 출력되는 현상을 확인할 수 있습니다:
[root@rhel92 ~]# top -n 2 | grep Cpu > test.txt [root@rhel92 ~]# vim test.txt %Cpu(s):^[(B^[[m^[[39;49m^[[1m 0.0 ^[(B^[[m^[[39;49mus,^[(B^[[m^[[39;49m^[[1m 3.1 ^[(B^[[m^[[39;49msy,^[(B^[[m^[[39;49m^[[1m 0.0 ^[(B^[[m^[[39;49mni,^[(B^[[m^[[39;49m^[[1m 96.9 ^[(B^[[m^[[39;49mid,^[(B^[[m^[[39;49m^[[1m 0.0 ^[(B^[[m^[[39;49mwa,^[(B^[[m^[[39;49m^[[1m 0.0 ^[(B^[[m^[[39;49mhi,^[(B^[[m^[[39;49m^[[1m 0.0 ^[(B^[[m^[[39;49msi,^[(B^[[m^[[39;49m^[[1m 0.0 ^[(B^[[m^[[39;49mst^[(B^[[m^[[39;49m^[(B^[[m^[[39;49m^[[K %Cpu(s):^[(B^[[m^[[39;49m^[[1m 3.2 ^[(B^[[m^[[39;49mus,^[(B^[[m^[[39;49m^[[1m 3.8 ^[(B^[[m^[[39;49msy,^[(B^[[m^[[39;49m^[[1m 0.0 ^[(B^[[m^[[39;49mni,^[(B^[[m^[[39;49m^[[1m 92.7 ^[(B^[[m^[[39;49mid,^[(B^[[m^[[39;49m^[[1m 0.0 ^[(B^[[m^[[39;49mwa,^[(B^[[m^[[39;49m^[[1m 0.2 ^[(B^[[m^[[39;49mhi,^[(B^[[m^[[39;49m^[[1m 0.2 ^[(B^[[m^[[39;49msi,^[(B^[[m^[[39;49m^[[1m 0.0 ^[(B^[[m^[[39;49mst^[(B^[[m^[[39;49m^[(B^[[m^[[39;49m^[[K
위와 같은 파일을 vim
으로 열면 이상한 제어 문자가 보이지만, cat
명령어로 출력하면 다음과 같이 정상적인 형식으로 확인됩니다:
[root@rhel92 ~]# cat test.txt %Cpu(s): 0.0 us, 3.1 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu(s): 3.2 us, 3.8 sy, 0.0 ni, 92.7 id, 0.0 wa, 0.2 hi, 0.2 si, 0.0 st
근본 원인
파일 속성을 확인해 보면, 일반 텍스트가 아닌 ANSI 이스케이프 시퀀스를 포함한 텍스트임을 알 수 있습니다
[root@rhel92 ~]# file test.txt test.txt: ASCII text, with very long lines, with escape sequences
이는 top
명령어가 터미널 환경에서 색상, 강조, 커서 이동 등을 표현하기 위해 ANSI 이스케이프 시퀀스를 출력에 포함시키기 때문입니다. 해당 시퀀스는 터미널에서는 제어 코드로 해석되지만, 텍스트 파일에서는 그대로 기록됩니다.
ANSI 이스케이프 시퀀스(ANSI escape sequences)는 비디오 텍스트 터미널 및 터미널 에뮬레이터에서 커서 위치, 색, 글꼴 스타일, 그 밖의 옵션을 제어하는 대역 내 신호 방식을 위한 표준이다. 대부분 ASCII 이스케이프 문자와 괄호 문자로 시작하는 특정 바이트 시퀀스들은 텍스트에 임베디드된다. 터미널은 이 시퀀스들을 텍스트가 아닌 명령으로 해석한다.
해결
top
명령어는 이러한 문제를 방지하기 위해 배치 모드(batch mode)를 지원하는 -b
옵션을 제공합니다. 이 모드를 사용하면 ANSI 제어 문자가 포함되지 않은 출력 결과를 얻을 수 있어, 다른 명령어와 연계하거나 파일 저장에 적합합니다.
매뉴얼에서도 -b
옵션은 다른 프로그램이나 파일로 출력을 전달할 때 유용하다고 명시되어 있습니다
[root@rhel92 ~]# man top ... -b :Batch-mode operation Starts top in Batch mode, which could be useful for sending output from top to other programs or to a file. In this mode, top will not accept input and runs until the iterations limit you've set with the `-n' command-line option or until killed.
적용 예시
배치 모드로 실행하면 ANSI 이스케이프 문자가 제거된 상태로 출력됩니다
[root@rhel92 ~]# top -b -n 2 | grep Cpu > test.txt [root@rhel92 ~]# vim test.txt %Cpu(s): 0.0 us, 5.9 sy, 0.0 ni, 94.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
vim
, grep
, awk
등 다양한 도구로 가공해도 특수 문자로 인한 문제가 발생하지 않습니다.참조
https://stackoverflow.com/questions/9927284/top-command-special-characters-in-shell-script
댓글
댓글 쓰기