bash中的awk和printf

时间:2009-10-01 16:36:08

标签: 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 days, 18 min, 15 users, load average: 10.02, 10.04, 9.58

在我的笔记本电脑(Ubuntu)上它是类似的

`$ uptime

13:53:58 up 3 days,12:02,8位用户,平均负载:0.29,0.48,0.60`

这就是我参加第5场比赛的原因。

5 个答案:

答案 0 :(得分:9)

来自正常运行时间输出的第5个逗号分隔字段是不存在的(至少在我的系统上),这就是为什么你不断变为零的原因。 5分钟的正常运行时间是倒数第二个字段,因此可行:

uptime | awk '{printf "%.0f\n",$(NF-1)}'  

答案 1 :(得分:3)

最简单的版本(使用内置的awk printf - kudos Dennis Williamson):

uptime |awk -F, '{printf "%0.f\n",$5}'

原始答案:改为通过xargs运行。

uptime |awk -F, '{print $5}' |xargs printf "%0.f\n"

答案 2 :(得分:1)

你可以做到

printf "%.0f\n" `uptime | awk -F, '{print $5}'`

反引号本质上是命令替换,因此无论uptime | awk -F, '{print $5}'的输出是什么,都将成为printf的参数。

第一种方法的问题是printf不接受来自stdin的参数;如果它 stdin获取参数,那么它本来可以正常工作。此外,printf没有任何参数显然意味着“为我的论点添加零”。

$ echo hello | printf "%s"

$ printf "%s" hello
hello
$ printf "%.0f"
0

答案 3 :(得分:1)

我认为你不能在stdin上输入printf。试试这个版本:

printf "%.0f\n" `uptime | awk -F, '{print $5}'`

答案 4 :(得分:1)

如果安装了/ proc,可以使用/ proc / loadavg:

LANG=C
read _ uptime _ </proc/loadavg
printf "%.0f\n" $uptime

以上代码仅使用内置shell命令。然而, 如果你愿意,也可以使用awk:

 awk '{printf "%.0f\n",$2}' /proc/loadavg