我正在尝试实现以下操作,但很难让它按预期工作。尝试使用 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
感谢您提供任何帮助。小心并确保安全。
watch
当您想……观看时,它是一个很好的工具。它与终端交互。如果将其输出重定向到文件,那么最终您会发现终端控制序列写入文件。如果这是您尝试过的,那么这些序列可能就是您提到的混乱。在循环中运行命令的一种直接方法是……嗯,使用循环。:)
您说您想
netstat | …
“每 2 秒”运行一次。在一个循环中,您有两个选择:您异步运行管道
sleep
2 秒并运行新管道;等等。这样它几乎是完美的“每 2 秒”。但是,如果单次迭代的执行时间超过了间隔,则它的输出可能会出现在下一次的输出之后,甚至与它交错。您同步运行管道
sleep
2 秒并运行新的管道;等等。这样,它不是“每 2 秒”,而是“中间 2 秒”。但是由于在任何给定时刻最多有一个管道在运行,因此整体输出不存在被破坏的风险。Note大约每 10 秒
watch -n 2 'sleep 10; date'
运行一次。date
它watch
本身使用“中间 2 秒”的方法,而不是“每 2 秒”。whatever
在 2 秒之间运行并将输出重定向到文件的循环可以是:在您的情况下,还有两个额外的问题:
你想要一个标题。首先将其放入文件中,然后将 (
>>
) 附加到文件中。您希望日期与以下内容位于同一行。(即使是自定义格式)的输出
date
以换行符结尾。您可以使用 删除它tr
。或者将输出捕获到一个变量(使用$()
它删除所有尾随换行符)并稍后打印。像这样: