如何每 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. 您异步运行管道,sleep运行 2 秒,然后运行新的管道;依此类推。这样几乎完美地实现了“每 2 秒”。但如果执行单个迭代所花的时间超过间隔,则该迭代的输出可能会出现在下一个迭代的输出之后,甚至与下一个迭代的输出交错。

  2. 您同步运行管道,sleep运行 2 秒,然后运行新的管道;依此类推。这样就不是“每 2 秒”,而是“中间间隔 2 秒”。但由于在任何给定时刻最多只有一个管道在运行,因此不存在整体输出被破坏的风险。

注意每 10 秒watch -n 2 'sleep 10; date'运行一次。本身使用“间隔 2 秒”方法,而不是“每 2 秒”。datewatch

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

相关内容