用 bash 解析“uptime”的输出

Kee*_*eek 3 freebsd bash awk uptime

我想将uptime命令的输出保存到 Bash 脚本中的 csv 文件中。由于该uptime命令根据自上次重新启动以来的时间具有不同的输出格式,因此我想出了一个基于 的非常繁重的解决方案case,但肯定有一种更优雅的方法来做到这一点。

正常运行时间输出:

 8:58AM  up 15:12, 1 user, load averages: 0.01, 0.02, 0.00
Run Code Online (Sandbox Code Playgroud)

想要的结果:

15:12,1 user,0.00 0.02 0.00,
Run Code Online (Sandbox Code Playgroud)

当前代码:

case "`uptime | wc -w | awk '{print $1}'`" in
#Count the number of words in the uptime output

10)
    #e.g.:  8:16PM  up  2:30, 1 user, load averages: 0.09, 0.05, 0.02
    echo -n `uptime | awk '{ print $3 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $4,$5 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $8,$9,$10 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;

12)
    #e.g.: 1:41pm  up 105 days, 21:46,  2 users,  load average: 0.28, 0.28, 0.27
    echo -n `uptime | awk '{ print $3,$4,$5 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $6,$7 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $10,$11,$12 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;

13)
    #e.g.: 12:55pm  up 105 days, 21 hrs,  2 users,  load average: 0.26, 0.26, 0.26
    echo -n `uptime | awk '{ print $3,$4,$5,$6 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $7,$8 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $11,$12,$13 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;
esac
Run Code Online (Sandbox Code Playgroud)

小智 10

我建议您直接访问源代码,而不是解析 uptime(1) 输出。

  • 正常运行时间在 /proc/uptime
  • 平均负载在 /proc/loadavg
  • 用户数量有点多,请参阅Wikipedia:utmp,但w(1)orwho(1)命令会帮助您。

以下不完全是您要求的所需输出,但您明白了:

$ echo $(cut -d ' ' -f 1 </proc/uptime),$(w -h | wc -l),$(cut -d ' ' -f 1-3 </proc/loadavg),
8545883.49,4,0.00 0.01 0.05
Run Code Online (Sandbox Code Playgroud)

这意味着 8.55e6 秒(将近 99 天),4 个用户,平均负载。

  • 抱歉,这个问题被错误地标记为“linux”,我在 FreeBSD 系统(FreeNAS)上,但我明白你的意思,方法是相似的:解析 `/sbin/sysctl kern.boottime` 和 `/sbin/sysctl vm。 loadavg` 感谢您的提示! (2认同)