如何每 2 秒將 netstat 指令輸出到文字文件

如何每 2 秒將 netstat 指令輸出到文字文件

我正在努力實現以下目標,但很難讓它按預期工作。嘗試使用 watch 命令,但輸出一團糟。我發現了以下內容,但無法使其滿足我的需求:

watch 2 "netstat -a | grep 20427 | grep ESTABLISHED | wc -l"

我想運行以下命令並每兩秒輸出到包含以下兩列的檔案。

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當你想…嗯,觀看時,這是一個很好的工具。它與終端交互。如果將其輸出重定向到文件,那麼最終您會發現終端控制序列寫入該文件。如果這是您嘗試過的,那麼這樣的序列可能就是您提到的混亂。

在循環中運行命令的簡單方法是……嗯,使用循環。 :)

你說你想netstat | …「每 2 秒」運行一次。在循環中你有兩個選擇:

  1. 您非同步運行管道sleep2 秒,然後運行新管道;等等。這樣就幾乎完美地「每2秒」一次。但是,如果單次迭代的執行時間超過了間隔,則其輸出可能出現在下一次迭代的輸出之後,甚至與下一次迭代的輸出交錯。

  2. 您同步運行管道sleep2 秒,然後運行新管道;等等。這樣,它就不是「每 2 秒」一次,而是「中間 2 秒」一次。但由於在任何給定時刻最多有一條管道在運行,因此不存在整體輸出受到破壞的風險。

Note大約每 10 秒watch -n 2 'sleep 10; date'運作一次。datewatch本身使用“間隔2秒”的方法,而不是“每2秒”。

whatever間隔 2 秒運作並將輸出重定向到檔案的循環可以是:

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

在你的情況下還有兩個額外的問題:

  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

相關內容