我正在努力實現以下目標,但很難讓它按預期工作。嘗試使用 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 秒」運行一次。在循環中你有兩個選擇:
您非同步運行管道
sleep
2 秒,然後運行新管道;等等。這樣就幾乎完美地「每2秒」一次。但是,如果單次迭代的執行時間超過了間隔,則其輸出可能出現在下一次迭代的輸出之後,甚至與下一次迭代的輸出交錯。您同步運行管道
sleep
2 秒,然後運行新管道;等等。這樣,它就不是「每 2 秒」一次,而是「中間 2 秒」一次。但由於在任何給定時刻最多有一條管道在運行,因此不存在整體輸出受到破壞的風險。
Note大約每 10 秒watch -n 2 'sleep 10; date'
運作一次。date
它watch
本身使用“間隔2秒”的方法,而不是“每2秒”。
whatever
間隔 2 秒運作並將輸出重定向到檔案的循環可以是:
while :; do whatever; sleep 2; done >output_file
在你的情況下還有兩個額外的問題:
你想要一個標題。先將其放入文件中,然後將 (
>>
) 附加到文件中。您希望日期與以下內容位於同一行。輸出
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