次のことを実行しようとしていますが、期待どおりに動作させるのに苦労しています。watch コマンドを使用してみましたが、出力が混乱しています。次のものを見つけましたが、ニーズに合わせて動作させることができませんでした。
watch 2 "netstat -a | grep 20427 | grep ESTABLISHED | wc -l"
次のコマンドを実行し、2 秒ごとに次の 2 つの列を含むファイルに出力します。
netstat -a | grep 20427 | grep ESTABLISHED | wc- l
DATE_TIME | NUMBER_OF_CONNECTIONS
Fri Nov 6 14:57:37 | 5
Fri Nov 6 14:57:39 | 10
Fri Nov 6 14:57:41 | 5
Fri Nov 6 14:57:43 | 2
ご協力いただければ幸いです。お気をつけて、安全にお過ごしください。
答え1
watch
は、まあ、見たいときには良いツールです。端末とやり取りします。出力をファイルにリダイレクトすると、最終的にはファイルに書き込まれた端末制御シーケンスが見つかります。これを試したのであれば、そのようなシーケンスがおそらくあなたが言及した混乱の原因です。
ループ内でコマンドを実行する最も簡単な方法は、ループを使用することです。 :)
「2 秒ごとに」実行したいとのことですがnetstat | …
、ループには 2 つのオプションがあります。
パイプラインを非同期で
sleep
2 秒間実行し、新しいパイプラインを実行する、というように繰り返します。この方法では、ほぼ完全に「2 秒ごと」になります。ただし、1 回の反復の実行に間隔よりも長い時間がかかる場合、その出力が次の反復の出力の後に表示されるか、または次の反復の出力と交互に表示されることがあります。パイプラインを
sleep
2 秒間同期的に実行し、新しいパイプラインを実行します。この方法では、「2 秒ごと」ではなく、「2 秒間隔」になります。ただし、特定の瞬間に実行されるパイプラインは最大で 1 つであるため、全体の出力が乱れるリスクはありません。
ノートは約 10 秒ごとにwatch -n 2 'sleep 10; date'
実行されます。ノート自体は、「2 秒ごと」ではなく、「2 秒間隔」方式を使用します。date
watch
whatever
2 秒間隔で実行され、出力をファイルにリダイレクトするループは次のようになります。
while :; do whatever; sleep 2; done >output_file
あなたの場合、さらに 2 つの問題があります。
ヘッダーが必要です。まずファイルにヘッダーを配置し、次に
>>
ファイルに ( ) を追加します。日付を次の行と同じ行に表示したいとします。 からの出力は
date
(カスタム フォーマットの場合でも) 改行文字で終わります。 を使用してこれを削除できますtr
。または、出力を変数にキャプチャし ( を使用すると$()
末尾の改行がすべて削除されます)、後で印刷します。
このような:
echo 'DATE_TIME | NUMBER_OF_CONNECTIONS' >output_file
while :; do
date="$(date)"
printf '%s | ' "$date"
netstat -a | grep 20427 | grep ESTABLISHED | wc -l
sleep 2
done >>output_file