![시계 안에 명령을 넣을 수 없습니다](https://linux55.com/image/194454/%EC%8B%9C%EA%B3%84%20%EC%95%88%EC%97%90%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EB%84%A3%EC%9D%84%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
완벽하게 작동하는 다음 명령이 있습니다.
netstat -tuplean | awk '{NR>1; if( $6 ~ /ESTABLISHED/ ) print "\033[0;31m" $5 " \033[01;31m"$6;if ($6 ~ /_WAIT/ ) print "\033[0;34m"$5 " \033[01;32m"$6}'
이것을 watch 명령으로 묶을 수는 없습니다. 내가 시도한 것은 다음과 같습니다.
모든 작은따옴표(
'
) 를 이스케이프하세요.watch 'netstat -tuplean | awk '\''{NR>1; if( $6 ~ /ESTABLISHED/ ) print "\033[0;31m" $5 " \033[01;31m"$6 if ($6 ~ /_WAIT/ ) print "\033[0;34m"$5 " \033[01;32m"$6}'\'''
산출:
^[0;31m34.210.39.83:443 ^[01;31mESTABLISHED ^[0;31m34.107.221.82:80 ^[01;31mESTABLISHED ^[0;31m34.107.221.82:80 ^[01;31mESTABLISHED ^[0;34m34.117.59.81:80 ^[01;32mTIME_WAIT ^[0;34m34.117.59.81:80 ^[01;32mTIME_WAIT ^[0;31m192.168.0.1:67 ^[01;31mESTABLISHED
작은따옴표와 큰따옴표(
'
및"
) 를 이스케이프 처리하세요.watch 'netstat -tuplean | awk '\''{NR>1; if( $6 ~ /ESTABLISHED/ ) print '\'"\033[0;31m'\'" $5 " \033[01;31m'\'"$6 if ($6 ~ /_WAIT/ ) print '\'"\033[0;34m'\'"$5 '\'" \033[01;32m'\'"$6}'\'''
산출:
bash: syntax error near unexpected token `print'
명령을 내보낸 후 다음과 같이 다시 호출합니다.
while : do ...<cmd>...; sleep 2;done watch -n 3 -x bash -c "$cmd"
변수를 정의할 때도 같은 문제가 발생하기 때문에 작동하지 않습니다.
다음 명령을 사용하여 스크립트를 만들어 보았습니다.
while : do ...<cmd>...; sleep 2;done
수면 지연이 고려되지 않은 것처럼 보이기 때문에 작동하지 않습니다. 결과적으로 출력이 너무 빨라 내용을 읽을 수 없습니다.
답변1
루프 기반 시도에서 사용한 전체 코드를 공유하지 않았으므로 다음은 약간 수정된 AWK 스크립트를 기반으로 하는 여러 수준의 참조를 처리하지 않는 데 필요한 몇 가지 옵션입니다.
코드를 실행 파일로 저장할 수 있습니다.
#!/bin/bash
netstat -tuplean | awk '
$6 ~ /ESTABLISHED/ { print "\033[0;31m" $5 " \033[01;31m"$6 }
$6 ~ /_WAIT/ { print "\033[0;34m"$5 " \033[01;32m"$6 }
$6 ~ /TIME_WAIT/ { print "\033[0;34m"$5 " \033[01;32m"$6 }
END { printf("%s","\033(B\033[m") } # Turn fancy formatting off'
그것을 실행 하고 watch
지적한 것처럼 지적하십시오.이미 가지고 있는 답변, 다음 옵션도 필요합니다 --color
.
watch -n 3 --color ./my_script
또는 무한 루프를 사용할 수 있습니다. 귀하의 경우 "수면 지연이 고려되지 않는 이유"가 예상대로 작동하는 것 같습니다.
while :
do
clear
netstat -tuplean | awk '
$6 ~ /ESTABLISHED/ { print "\033[0;31m" $5 " \033[01;31m"$6 }
$6 ~ /_WAIT/ { print "\033[0;34m"$5 " \033[01;32m"$6 }
$6 ~ /TIME_WAIT/ { print "\033[0;34m"$5 " \033[01;32m"$6 }
END { printf("%s","\033(B\033[m") } # Turn fancy formatting off'
sleep 3
done
스크립트를 변수에 저장하고 로 실행하려면 bash -c "$cmd"
여기 문서와 명령 대체를 결합할 수 있습니다. 문서의 태그가 참조되는 경우(여기 'EOT'
) 해당 콘텐츠는 확장되지 않습니다.
cmd=$(cat <<'EOT'
netstat -tuplean | awk '
$6 ~ /ESTABLISHED/ { print "\033[0;31m" $5 " \033[01;31m"$6 }
$6 ~ /_WAIT/ { print "\033[0;34m"$5 " \033[01;32m"$6 }
$6 ~ /TIME_WAIT/ { print "\033[0;34m"$5 " \033[01;32m"$6 }
END { printf("%s","\033(B\033[m") } # Turn fancy formatting off'
EOT
)
답변2
모든 것을 작은따옴표로 묶고 이전 작은따옴표를 올바르게 이스케이프하는 명령은 거의 괜찮습니다. 을 사용하지 않았기 때문에 "쓰레기"가 인쇄됩니다 watch --color
.
watch --color 'netstat -tuplean | awk '\''{NR>1; if( $6 ~ /ESTABLISHED/ ) print "\033[0;31m" $5 " \033[01;31m"$6
if ($6 ~ /_WAIT/ ) print "\033[0;34m"$5 " \033[01;32m"$6
if ($6 ~ /TIME_WAIT/ ) print "\033[0;34m"$5 " \033[01;32m"$6}'\'
(원래 코드의 마지막 항목은 ''
이전 내용과 연결된 작은따옴표로 묶인 빈 문자열입니다. 아무 것도 변경되지 않습니다. 내 코드에서는 ''
이 쓸모 없는 내용을 완전히 생략합니다.)
~에서man 1 watch
:
-c
,--color
ANSI 색상 및 스타일 순서를 설명합니다.