我想修剪正常运行时间的输出
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/'
它不依赖于输出中出现的字符串“days” uptime
。
uptime | sed -E 's/^.+([0-9]+ days).+$/\1/'
您无需任何外部工具即可使用外壳
$ 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 | 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" - 但有时如果正常运行时间少于一天,它会将小时/分钟作为第一个基于时间的输出,而不是烦恼天数。输出的其余部分在列数方面非常一致。因此,我个人一直在使用 sed 来删除最后四列:
$ uptime | sed -e 's/^ [^ ]* up \(.*\)\(,[^,]*\)\{4\}$/\1/'
31 days, 35 min
或者,如果您只想要最重要的数据,您可以使用其他人提到的类似方法,您只需获取第一位数据。不到一天,这将导致<y> min
or <y>:<z>
。超过一天,它会导致<x> days
.
$ uptime | sed -e 's/^ [^ ]* up \([^,]*\).*/\1/'
31 days
最后,如果您想在小于 24 小时时反映零,您还可以选择在/proc/uptime
usingbc
或 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
这对我有用:
$ 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,