我正在尝试实现以下功能,但很难让它按预期工作。尝试使用 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 秒”。但由于在任何给定时刻最多只有一个管道在运行,因此不存在整体输出被破坏的风险。
注意每 10 秒watch -n 2 'sleep 10; date'
运行一次。本身使用“间隔 2 秒”方法,而不是“每 2 秒”。date
watch
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