시계 안에 명령을 넣을 수 없습니다

시계 안에 명령을 넣을 수 없습니다

완벽하게 작동하는 다음 명령이 있습니다.

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 명령으로 묶을 수는 없습니다. 내가 시도한 것은 다음과 같습니다.

  1. 모든 작은따옴표( ') 를 이스케이프하세요.

    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
    
  2. 작은따옴표와 큰따옴표( '") 를 이스케이프 처리하세요.

    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'
    
  3. 명령을 내보낸 후 다음과 같이 다시 호출합니다.

     while : do ...<cmd>...; sleep 2;done
     watch -n 3 -x bash -c "$cmd" 
    

    변수를 정의할 때도 같은 문제가 발생하기 때문에 작동하지 않습니다.

  4. 다음 명령을 사용하여 스크립트를 만들어 보았습니다.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 색상 및 스타일 순서를 설명합니다.

관련 정보