bash 中的 awk 和 printf

发布于 2024-08-06 13:38:47 字数 727 浏览 3 评论 0原文

我正在尝试获取过去 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

黯然 2024-08-13 13:38:47

正常运行时间输出中的第五个逗号分隔字段不存在(至少在我的系统上),这就是为什么你总是得到零。 5 分钟正常运行时间是倒数第二个字段,因此以下方法有效:

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

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:

uptime | awk '{printf "%.0f\n",$(NF-1)}'  
往日情怀 2024-08-13 13:38:47

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

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

原始答案:通过 xargs 运行它。

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

Simplest version (use built-in awk printf - kudos Dennis Williamson):

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

Original answer: Run it through xargs instead.

uptime |awk -F, '{print $5}' |xargs printf "%0.f\n"
陪你搞怪i 2024-08-13 13:38:47

您可以执行

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

You can just do

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

The backticks are essentially command substitution, so whatever the output of uptime | awk -F, '{print $5}' is, will be the argument to printf.

The problem with the first approach is that printf just does not accept arguments from stdin; if it did take arguments from stdin, then it would have worked fine. Also, no arguments to printf apparently does mean "put zero in for my arguments".

$ echo hello | printf "%s"

$ printf "%s" hello
hello
$ printf "%.0f"
0
魔法少女 2024-08-13 13:38:47

我认为您不能将输入提供给 stdin 上的 printf 。试试这个版本:

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

I don't think you can feed the input to printf on stdin. Try this version:

printf "%.0f\n" `uptime | awk -F, '{print $5}'`
明天过后 2024-08-13 13:38:47

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

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

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

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

If you have /proc mounted you can use /proc/loadavg:

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

The above code uses only built-in shell commands. However,
if you like, you can use awk too:

 awk '{printf "%.0f\n",$2}' /proc/loadavg
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文