時計の中にコマンドを入れることはできません

時計の中にコマンドを入れることはできません

完全に機能する次のコマンドがあります。

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の色とスタイルの順序を説明します。

関連情報