仅显示正常运行时的正常运行时间[unix]

时间:2009-11-15 20:13:06

标签: regex sed uptime

我想从正常运行时间中减少输出

20:10  up 23 days,  3:28, 3 users, load averages: 3.84 1.06 0.64

所以它只是显示:

23 days

我尝试过使用sed,但我不确定它是否适合这项工作,并且没有太多使用它的经验。

如何实现我想要的输出?

10 个答案:

答案 0 :(得分:13)

考虑使用cut

  uptime | tr "," " " | cut -f6-8 -d" "

似乎适用于我的MacBook。在这里,我还使用tr来杀死一个无关的“,”。短期和长期运行时间的格式存在一些问题。


可能的解决方案:

uptime | sed 's/.*up \([^,]*\), .*/\1/'

不依赖于uptime输出中出现的字符串“days”。

答案 1 :(得分:5)

uptime | sed -E 's/^.+([0-9]+ days).+$/\1/'

答案 2 :(得分:5)

你可以在没有任何外部工具的情况下使用shell

$ var="20:10  up 23 days,  3:28, 3 users, load averages: 3.84 1.06 0.64"
$ var=${var/#*up}
$ echo ${var%%,*}
23 days

答案 3 :(得分:5)

我认为这是最简单的解决方案:

uptime | awk '{print $3}'

正常运行时间| awk' {print $ 3}'

10

答案 4 :(得分:4)

以上解决方案仅显示日期或小时。我意识到OP正在寻找的东西,但我也在寻找包括小时和分钟的东西。这会显示系统开启超过一天的天数和小时/分钟,或仅显示不到一天的小时数:

uptime | sed 's/^.* up \+\(.\+\), \+[0-9] user.*$/\1/'

支持黑带正则表达忍者Zach W让这个工作。

答案 5 :(得分:2)

uptime=$(</proc/uptime) ;  uptime=${uptime%%.*} ; days=$(( uptime/60/60/24 )); echo $days days

答案 6 :(得分:0)

echo $PATH

如果自上次重启后有n天,则会打印n天。如果正常运行时间少于一天,它将以hh:mm打印一段时间。

uptime | cut -d',' -f 1 | cut -d 'p' -f 2-

答案 7 :(得分:0)

以上答案是正确的,但如果您有任何人想使用awk,请使用:

uptime | awk '{ print $3,$4 }'

结果:

15 days,

答案 8 :(得分:0)

uptime的输出通常为“ x天,y分钟”或“ x天,y:z”-但是有时候,如果正常运行时间少于一天,小时/分钟作为第一个基于时间的输出,并且不会影响天数。其余输出在列数方面非常一致。因此,我个人一直使用sed删除最后四列:

$ uptime | sed -e 's/^ [^ ]* up \(.*\)\(,[^,]*\)\{4\}$/\1/'
31 days, 35 min

或者,如果您只想要最重要的数据,则可以使用其他人提到的类似方法,即仅获取第一位数据。在不到一天的时间内,这将导致<y> min<y>:<z>。超过一天,它将产生<x> days

$ uptime | sed -e 's/^ [^ ]* up \([^,]*\).*/\1/'
31 days

最后,如果要在少于24小时的时间内反映零,还可以选择使用/proc/uptime或shell表达式在bc上使用一些数学运算:

$ uptime
 13:58:41 up 31 days, 55 min,  9 users,  load average: 0.80, 0.89, 0.81
$ echo $(( $(awk -F . '{print $1}' /proc/uptime) / 86400)) days
31 days

$ uptime
 13:59:01 up 21:18,  1 user,  load average: 0.00, 0.00, 0.00
$ echo $(( $(awk -F . '{print $1}' /proc/uptime) / 86400)) days
0 days

答案 9 :(得分:0)

这对我有用:

$ uptime | grep -o "[0-9]* days"
70 days