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

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

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

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
)

おすすめ記事