4

我想修剪正常运行时间的输出

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

所以它只显示:

23 days

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

我怎样才能达到我想要的输出?

4

10 回答 10

14

考虑使用cut.

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

似乎可以在我的 MacBook 上使用。在这里我也习惯tr了杀死一个无关紧要的“,”。对于短期和长期正常运行时间,不同格式存在一些问题。


一个可能的 sed 解决方案:

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

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

于 2009-11-15T20:15:08.800 回答
5
uptime | sed -E 's/^.+([0-9]+ days).+$/\1/'
于 2009-11-15T20:15:58.527 回答
5

您无需任何外部工具即可使用外壳

$ 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
于 2009-11-16T06:00:14.503 回答
5

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

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

支持黑带正则表达式忍者 Zach W 使其正常工作。

于 2013-04-16T15:56:37.850 回答
4

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

uptime | awk '{print $3}'

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

10

于 2014-12-02T17:20:23.743 回答
3
uptime=$(</proc/uptime) ;  uptime=${uptime%%.*} ; days=$(( uptime/60/60/24 )); echo $days days
于 2013-10-27T19:01:00.807 回答
1

uptime的输出通常有 "x days, y min" 或 "x days, y:z" - 但有时如果正常运行时间少于一天,它会将小时/分钟作为第一个基于时间的输出,而不是烦恼天数。输出的其余部分在列数方面非常一致。因此,我个人一直在使用 sed 来删除最后四列:

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

或者,如果您只想要最重要的数据,您可以使用其他人提到的类似方法,您只需获取第一位数据。不到一天,这将导致<y> minor <y>:<z>。超过一天,它会导致<x> days.

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

最后,如果您想在小于 24 小时时反映零,您还可以选择在/proc/uptimeusingbc或 shell 表达式上使用一些数学:

$ 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
于 2018-07-19T12:11:54.073 回答
1

这对我有用:

$ uptime | grep -o "[0-9]* days"
70 days
于 2018-07-19T12:21:51.643 回答
0
uptime | cut -d',' -f 1 | cut -d 'p' -f 2-

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

$ uptime
12:20  up  1:36, 1 user, load averages: 2.75 2.63 2.26
$ uptime | cut -d',' -f 1 | cut -d 'p' -f 2-
  1:36
于 2016-03-15T16:22:49.233 回答
0

上面的答案是正确的,但如果你们中的任何一个人想使用 awk,那么使用:

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

结果:

15 days,
于 2018-01-07T21:39:18.040 回答