2秒ごとにnetstatコマンドをテキストファイルに出力するにはどうすればよいですか

2秒ごとにnetstatコマンドをテキストファイルに出力するにはどうすればよいですか

次のことを実行しようとしていますが、期待どおりに動作させるのに苦労しています。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 つのオプションがあります。

  1. パイプラインを非同期でsleep2 秒間実行し、新しいパイプラインを実行する、というように繰り返します。この方法では、ほぼ完全に「2 秒ごと」になります。ただし、1 回の反復の実行に間隔よりも長い時間がかかる場合、その出力が次の反復の出力の後に表示されるか、または次の反復の出力と交互に表示されることがあります。

  2. パイプラインをsleep2 秒間同期的に実行し、新しいパイプラインを実行します。この方法では、「2 秒ごと」ではなく、「2 秒間隔」になります。ただし、特定の瞬間に実行されるパイプラインは最大で 1 つであるため、全体の出力が乱れるリスクはありません。

ノートは約 10 秒ごとにwatch -n 2 'sleep 10; date'実行されます。ノート自体は、「2 秒ごと」ではなく、「2 秒間隔」方式を使用します。datewatch

whatever2 秒間隔で実行され、出力をファイルにリダイレクトするループは次のようになります。

while :; do whatever; sleep 2; done >output_file

あなたの場合、さらに 2 つの問題があります。

  1. ヘッダーが必要です。まずファイルにヘッダーを配置し、次に>>ファイルに ( ) を追加します。

  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

関連情報