【发布时间】:2009-11-15 20:13:06
【问题描述】:
我想调整正常运行时间的输出
20:10 up 23 days, 3:28, 3 users, load averages: 3.84 1.06 0.64
所以它只是显示:
23 days
我尝试过使用 sed,但我不确定它是否适合这项工作,也没有太多使用它的经验。
我怎样才能达到我想要的输出?
【问题讨论】:
我想调整正常运行时间的输出
20:10 up 23 days, 3:28, 3 users, load averages: 3.84 1.06 0.64
所以它只是显示:
23 days
我尝试过使用 sed,但我不确定它是否适合这项工作,也没有太多使用它的经验。
我怎样才能达到我想要的输出?
【问题讨论】:
考虑使用cut。
uptime | tr "," " " | cut -f6-8 -d" "
似乎可以在我的 MacBook 上使用。在这里,我还使用了tr 来杀死无关的“,”。短期和长期正常运行时间的不同格式存在一些问题。
一个可能的 sed 解决方案:
uptime | sed 's/.*up \([^,]*\), .*/\1/'
它不依赖于出现在uptime 的输出中的字符串“days”。
【讨论】:
uptime | sed -E 's/^.+([0-9]+ days).+$/\1/'
【讨论】:
days 不存在时(在不到一天前重新启动时),此解决方案将不起作用。
你可以直接使用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
【讨论】:
上述解决方案仅显示天数或小时数。我意识到这就是 OP 正在寻找的东西,但我也在寻找包括小时和分钟在内的内容。这会显示系统开启超过一天的天数和小时/分钟,或者仅显示系统开启不到一天的小时数:
uptime | sed 's/^.* up \+\(.\+\), \+[0-9] user.*$/\1/'
向黑带正则表达式忍者 Zach W 提供支持以使其正常工作。
【讨论】:
uptime 输出为“1 个用户”,因此与上面的“用户”(复数)不匹配。将其更改为“用户”,它似乎可以工作。
user 或users,您可以将正则表达式的结尾更改为...users?.*$。但是,正如@PeterGibson 建议的那样,.*$ 匹配到行尾的所有内容,只是省略了s,给...user.*$ 应该可以工作。
我认为这是最简单的解决方案:
uptime | awk '{print $3}'
正常运行时间 | awk '{打印 $3}'
10
【讨论】:
uptime=$(</proc/uptime) ; uptime=${uptime%%.*} ; days=$(( uptime/60/60/24 )); echo $days days
【讨论】:
uptime 的输出通常有“x days, y min”或“x days, y:z” - 但有时如果正常运行时间少于一天,它有几个小时/minutes 作为第一个基于时间的输出,并且不关心天数。输出的其余部分在列数方面非常一致。因此,我个人一直使用 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 小时时反映零,您还可以选择使用 bc 或 shell 表达式对 /proc/uptime 进行一些数学运算:
$ 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
【讨论】:
这对我有用:
$ uptime | grep -o "[0-9]* days"
70 days
【讨论】:
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
【讨论】:
以上答案是正确的,但如果你们中的任何一个想使用 awk,那么请使用:
uptime | awk '{ print $3,$4 }'
结果:
15 days,
【讨论】:
5:04, 1 的内容,反映 5 小时 4 分钟和一个用户登录。