完全に機能する次のコマンドがあります。
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の色とスタイルの順序を説明します。