bash 中的 awk 和 printf
我正在尝试获取过去 5 分钟内平均负载的四舍五入数。所以这是我的命令:
uptime | awk -F, '{print $5}'|printf "%.0f\n"
它似乎不正确,因为它总是给我 0。
如果我尝试使用变量作为 awk 和 printf 之间的中间变量,那么它是正确的
avgload=$(uptime | awk -F, '{print $5}')
printf "%.0f\n" $avgload
那么我的第一次尝试有什么问题吗?
谢谢和问候!
更新:
为了获取过去 5 分钟的平均负载,这里是我的 Linux 服务器 (Kubuntu) 上正常运行时间的输出
$ uptime
13:52:19 up 29 天,18 分钟,15 个用户,平均负载:10.02, 10.04, 9.58
在我的笔记本电脑 (Ubuntu) 上,它类似于
`$ uptime
13:53:58 up 3 days, 12: 02、8 个用户、平均负载:0.29、0.48、0.60 `
这就是我选择第 5 个字段的原因。
I am trying to get the rounded number of the average load in the past 5 mins. So here goes my command:
uptime | awk -F, '{print $5}'|printf "%.0f\n"
It seems incorrect as it always give me 0.
If I tried to use a variable as intermediate between awk and printf, then it is correct
avgload=$(uptime | awk -F, '{print $5}')
printf "%.0f\n" $avgload
So anything wrong with my first try?
Thanks and regards!
UPDATE:
Just for getting the average load in the past 5 mins, here is the output of uptime on my linux server (Kubuntu)
$ uptime
13:52:19 up 29 days, 18 min, 15 users, load average: 10.02, 10.04, 9.58
On my laptop (Ubuntu) it is similar
`$ uptime
13:53:58 up 3 days, 12:02, 8 users, load average: 0.29, 0.48, 0.60 `
That's why I take the 5th field.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
正常运行时间输出中的第五个逗号分隔字段不存在(至少在我的系统上),这就是为什么你总是得到零。 5 分钟正常运行时间是倒数第二个字段,因此以下方法有效:
The 5th comma-separated field from the uptime output is non-existant (on my system at least), which is why you keep getting zero. The 5-minute uptime is the second-to-last field, so this works:
最简单的版本(使用内置 awk printf - 荣誉 Dennis Williamson):
原始答案:通过 xargs 运行它。
Simplest version (use built-in awk printf - kudos Dennis Williamson):
Original answer: Run it through xargs instead.
您可以执行
反引号本质上是命令替换,因此无论
uptime | 的输出如何awk -F, '{print $5}'
是printf
的参数。第一种方法的问题是 printf 不接受来自 stdin 的参数;如果它确实从
stdin
获取参数,那么它会工作得很好。另外, printf 的无参数显然意味着“为我的参数添加零”。You can just do
The backticks are essentially command substitution, so whatever the output of
uptime | awk -F, '{print $5}'
is, will be the argument toprintf
.The problem with the first approach is that printf just does not accept arguments from
stdin
; if it did take arguments fromstdin
, then it would have worked fine. Also, no arguments to printf apparently does mean "put zero in for my arguments".我认为您不能将输入提供给 stdin 上的 printf 。试试这个版本:
I don't think you can feed the input to printf on stdin. Try this version:
如果安装了 /proc,则可以使用 /proc/loadavg:
上面的代码仅使用内置 shell 命令。然而,
如果你愿意,你也可以使用 awk:
If you have /proc mounted you can use /proc/loadavg:
The above code uses only built-in shell commands. However,
if you like, you can use awk too: