현재 tail 명령을 통해 표준 ANSI 색상을 사용하기 위해 다음 명령을 사용하고 있습니다.
tail -f syslogfile | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'
이것은 밝은 노란색이지만 저는 방금 bash에서 확장된 256 색상을 사용하고 있었고 주황색을 사용하고 싶었습니다. 검정색 바탕에 주황색을 주는 전경색과 배경색에 대한 올바른 번호 매기기 방식을 찾았습니다.
echo -e "\\033[40;5;95;38;5;202mhello world\\033[0m"
하지만 tail 명령과 함께 사용할 수 있는 sed 명령으로 변환할 수는 없습니다.
나는 이것을 시도했습니다 :
sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'
그러나 그것은 모든 것을 하얗게 만듭니다. 나는 시도했다:
sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'
그러나 이렇게 하면 "MAJOR" 문자열이 포함된 행이 검정색으로 만들어집니다. 또한 배경 구성표를 생략하고 주황색만 사용해 보았습니다.
sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[0m/'
그러나 이것은 또한 "MAJOR"라는 단어가 포함된 줄을 검게 만드는 것 같습니다. sed가 검정색 배경에 주황색을 표시하는 올바른 ANSI 시퀀스가 무엇인지 아는 사람이 있습니까? 참고로 첫 번째 예에서 사용한 sed 명령은 선택한 색상으로 전체 줄을 인쇄합니다. 단어 자체를 색칠하는 것이 아니라 새로운 색상 순서를 사용하여 동일한 동작이 필요합니다.
고쳐 쓰다:
이것은 작동합니다:
sed -e 's/\(.*MINOR.*\)/\o033[38;5;202m\1\o033[40;5;95m/'
그러나 보조 마젠타 색상을 포함하지 않는 다른 줄은 그대로 둡니다. 어떻게 하면 기본값을 흰색으로 되돌릴 수 있나요? 내가 뭔가를 제대로 닫지 않았나요? tail 명령을 종료할 때 볼 수 있듯이 실제로 전체 셸의 기본 글꼴 색상을 자홍색으로 설정합니다.
답변1
예제 스크립트를 작성하면 두 가지 이상의 문제를 볼 수 있습니다.
#!/bin/sh
MSG="this is MAJOR stuff"
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[0m/'
생성( ^[
이스케이프됨):
^[[93mthis is MAJOR stuff^[[39m
this is MAJOR stuff33[40;5;95;38;5;202this is MAJOR stuff33[0m
^[[40;5;95;38;5;202^[[0m
this is MAJOR stuff33[38;5;202this is MAJOR stuff33[0m
첫 번째 행에서 a는 ^[[93m
텍스트를 노란색으로 설정하고 ^39m
텍스트를 터미널의 기본 색상으로 재설정하는 aixterm 16색 이스케이프입니다.
두 번째 줄에는 종료되지 않은 이스케이프 시퀀스에 문제가 있습니다(배경을 검정색 = 40, 플래시 = 5, 95 = 밝은 자홍색 텍스트로 설정한 다음 38 및 5에서 종료되지 않은 256 색상 시퀀스를 도입하려고 시도함).
세 번째 행은 두 번째 행과 약간 다릅니다.
주요 문제는 다음 sed
과 같이 표현하지 않는 한 이스케이프 문자를 내보내지 않는다는 것입니다.\o033
했다여러 곳에서 하세요)
둘째, 탈옥을 올바르게 종료하지 않았습니다. 결승전은 m
이 시퀀스의 일부입니다. 마지막 문자가 손실되면 전체 시퀀스가 삭제될 수 있습니다. 문서를 읽는 것이 가장 좋습니다.XTerm 제어 순서.
그런데,미국 국립표준협회8개 이상의 색상을 포함하는 항목은 문서화되지 않았으므로 원래 구현(16개 색상의 경우 aixterm, 256색의 경우 xterm)을 통해 시퀀스를 참조하는 것이 덜 혼란스러울 것입니다.
전체 행만 원하는 경우기본주황색으로 강조 표시되면 (설명에 따라) 다음을 수행할 수 있습니다.
sed -e 's/^\(.*MAJOR.*\)$/\o033[48;5;95m\1\o033[m/'
그러나 이 코드는 아래와 같이 R/G/B를 사용하는 것만큼 널리 지원 5
되지 않습니다 .2
sed -e 's/^\(.*MAJOR.*\)$/\o033[48;2;128;128;0m\1\o033[m/'
(128 한 번만 시도해 보세요. 취향이 다를 수 있습니다.)
추가 자료:
- ECMA-48: 인코딩된 문자 집합에 대한 제어 기능
- 색상번호로 색상을 설정할 수 있나요?(xterm FAQ)
- XTerm 제어 순서
특히,
답변2
당신은 이것을 찾고있을 수 있습니다 :
sed -e 's/\(.*MAJOR.*\)/\o033[48;5;95;38;5;202m\1\o033[0m/'
다음과 같이 단순화할 수 있지만
sed -e 's/.*MAJOR.*/\o033[48;5;95;38;5;202m&\o033[m/'
변경은 배경색을 변경한다는 40
의미입니다 .48
배경색을 검정색으로 하고 싶다면:
sed -e 's/.*MAJOR.*/\o033[40;38;5;202m&\o033[m/'
배경색이 이미 검은색이라면 전혀 변경할 필요가 없습니다.
sed -e 's/.*MAJOR.*/\o033[38;5;202m&\o033[m/'