나는 특정 항목을 선택하고 색상을 지정하기 위해 로그 파일을 모니터링하는 스크립트를 직장에서 변경하고 있습니다. 최종 출력은 여러 열에 있는 6자리 숫자 목록입니다. 숫자의 시작 부분에 a를 추가할 수 있었고 ~
최종 출력에서는 아무 것도 깨지지 않았지만 다소 보기 흉하고 읽기가 어렵습니다. 그러나 이전 bash 스크립트나 perl 스크립트의 데이터 최종 처리에서 숫자를 색상화하려고 하면 색상 텍스트가 깨집니다.
예를 들어, 내가 입력할 원래 번호는 다음과 같습니다 $num
.
123456
나는 이것을 Perl에 입력했습니다(또는 Bash에도 거의 같은 내용을 입력했습니다).
"\e[1;34m" . $num . "\e[0m"
그리고 내가 얻은 것은 다음과 같습니다.
[1;34m123456[0m
나는 또한 이스케이프 버전을 시도했지만 동일한 결과를 얻었습니다.
"\x1B[1;34m" . $num . "\x1B[0m"
이것이 차이가 있다면 실제 스크립트 스택은 다음과 같습니다(엉망입니다).
grep
Perl은 쉘 스크립트 내부를 호출하여 /cut
/etc 로 파이프됩니다 .cut
/etc.가 더 많은 쉘 스크립트를 사용한 다음 .pl로 파이프됩니다.- 쉘 스크립트는 출력을 감시합니다.
watch
그럼 색깔이 마음에 안 드는 건 아닐까 ?
나도 잘 모르기 perl
때문에 인쇄된 선 주위에 보이는 것을 보여줘도 나쁠 것 같지 않습니다.
my $format = ("%-8s") x scalar(@{$a[0]});
printf("$format\n", @$_)
답변1
나는 '색상 도용' 문제에 직면했습니다.보다, watch는 간단한 /bin/sh 출력 스타일을 사용하기 때문에 모든 색상, 별칭, 바로가기... 전체를 방해합니다!
그래서 나는 이것을 함께 엮어 내 안에 놓았습니다..bashrc를 사용하면 내 별칭, 바로가기 등을 모두 사용할 수 있습니다.
Usage:
watcher 20 'somecommand | apipe | grep'
숫자는 업데이트 사이의 지연 시간(초)입니다. 명령에는 인용할 수 있는 모든 내용이 포함될 수 있습니다.
###### 'watch' workalike, lets me use my aliases and such
function watcher() { WATCHERTIME=$1 ; WATCHERFILE=/tmp/watcher$$ ; shift ; while true ; do WATCHERHEIGHT=$(($LINES - 5)) ; ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null; clear ; /bin/echo -n "Every ${WATCHERTIME} seconds - " ; date ; /bin/echo ; cat ${WATCHERFILE} ; \rm -f ${WATCHERFILE} ; /bin/echo ; /bin/echo "==" ; sleep ${WATCHERTIME} ; done ; }
분석하려면:
function watcher()
{
WATCHERTIME=$1
WATCHERFILE=/tmp/watcher$$
shift
while true; do
WATCHERHEIGHT=$(($LINES - 5))
( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null
clear
/bin/echo -n "Every ${WATCHERTIME} seconds - "
date
/bin/echo
cat ${WATCHERFILE}
\rm -f ${WATCHERFILE}
/bin/echo
/bin/echo "=="
sleep ${WATCHERTIME}
done
}
현재 화면 높이를 라인 단위로 결정하고 자체 출력에 맞게 충분히 뺀 다음 주어진 명령을 반복적으로 실행한 다음 화면을 지우고 출력을 표시하고 다음 루프를 기다립니다. 출력이 끝난 위치를 나타내기 위해 하단에 짧은 '=='를 표시합니다. 가끔은 이것을 아는 것이 도움이 될 때가 있습니다.
표시할 때 지연이 최소화되도록 이렇게 했습니다. 출력을 캡처하지 않고 표시하면 긴 일시 중지가 발생하고 출력이... 이상합니다.
색상이 흐트러지지 않기 때문에 익숙한 모든 것을 얻을 수 있습니다. 즐기다!
답변2
문제는 watch
Curses를 사용하고 curses
문자열 출력 함수가 문자 및 해당 속성/색상에 대한 별도의 평면이 있는 가상 프레임 버퍼에서 작동한다는 것입니다. 문자열은 터미널 지시문 해석 없이 있는 그대로 프레임 버퍼에 전송됩니다. 터미널 상태의 방해를 방지하기 위해 Curses는 ESC
무엇보다도 무시하므로 watch
기본적으로 색상을 수행하지 않습니다.
다음 중 하나의 현명한 조언을 따르면 문제를 해결할 수 있습니다.jw013또는로닉스: watch --color
스크립트를 while true; do clear; $SCRIPT; sleep 2; done
루프와 같은 것으로 사용하거나 래핑하십시오.
답변3
아마도 --color
옵션이 필요할 것입니다 watch
.