특정 항목을 선택하고 색상을 지정하기 위해 로그 파일을 모니터링하는 스크립트를 직장에서 변경하고 있습니다. 최종 출력은 여러 열에 있는 6자리 숫자 목록입니다. 숫자의 시작 부분에 a를 추가 할 수 있었고 ~
최종 출력에서는 아무 것도 깨지지 않았지만 꽤 보기 흉하고 읽기가 어렵습니다. 그러나 이전 bash 스크립트나 Perl 스크립트의 데이터 최종 처리에서 숫자에 색상을 지정하려고 하면 색상 텍스트가 손상됩니다.
예를 들어, 원시 숫자를 입력합니다 $num
.
123456
나는 이것을 Perl로 입력합니다(또는 Bash에서도 거의 같은 것을 입력합니다):
"\e[1;34m" . $num . "\e[0m"
이것이 내가 얻는 것입니다:
[1;34m123456[0m
나는 또한 이스케이프 버전을 시도했지만 동일한 결과를 얻었습니다.
"\x1B[1;34m" . $num . "\x1B[0m"
차이가 있다면 실제 스크립트 스택은 다음과 같습니다(혼란).
- Perl은 내부 쉘 스크립트를 호출한 다음
grep
/cut
등 으로 파이프됩니다. - 쉘 스크립트에는 더 많은
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
문자열 출력 함수는 별도의 문자와 해당 속성/색상 평면이 있는 가상 프레임 버퍼에서 작동합니다. 문자열은 터미널 명령 해석 없이 있는 그대로 프레임 버퍼로 전송됩니다. 최종 상태 손상을 방지하기 위해 ESC
무엇보다도 저주가 무시되므로 watch
기본적으로 색상이 수행되지 않습니다.
다음 중 현명한 조언을 따르면 이 문제를 해결할 수 있습니다.jw013또는로닉스: 루프와 같은 방식 watch --color
으로 스크립트를 사용하거나 래핑합니다 .while true; do clear; $SCRIPT; sleep 2; done
답변3
--color
을 선택 해야 할 수도 있습니다 watch
.