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

Regex 仅显示正常运行时间[unix]的正常运行时间,regex,sed,uptime,Regex,Sed,Uptime,我想减少正常运行时间的输出 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来杀死一个无关的“,”。对于短时间和长时间的正常运行,不同的

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

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 | awk '{print $3}'

它不依赖于
正常运行时间输出中出现的字符串“days”

您只需使用shell,无需任何外部工具

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/'

黑带regex ninja Zach W的道具,使其工作。

正常运行时间=$(我认为这是最简单的解决方案:

uptime | sed 's/.*up \([^,]*\), .*/\1/'
uptime=$(</proc/uptime) ;  uptime=${uptime%%.*} ; days=$(( uptime/60/60/24 )); echo $days days
uptime | awk '{print $3}'
正常运行时间| awk'{打印$3}'

十,

如果上次重新启动后有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,

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

$ uptime | sed -e 's/^ [^ ]* up \(.*\)\(,[^,]*\)\{4\}$/\1/'
31 days, 35 min
或者,如果您只需要最重要的数据,您可以使用其他人提到的类似方法,从哪里获取第一位数据。如果少于一天,这将导致
min
。如果多于一天,则会导致

$ uptime | sed -e 's/^ [^ ]* up \([^,]*\).*/\1/'
31 days
最后,如果要在小于24小时时反映零,还可以选择使用
/proc/uptime
上的一些数学运算,使用
bc
或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

\1表示第一个捕获的组(在括号中)。请注意,当子字符串
days
不存在时(当不到一天前重新启动时),此解决方案不起作用。不是我投了反对票……两人似乎都很合乎逻辑——也许他们只是心情不好!发生了开车经过的反对票。我只是想知道我的解决方案是否坏了。在Arch Linux上对我不起作用。很抱歉,我在反对票后忘了发表评论。@icco:有了更多信息,我可能可以修复它,但来自t“标准”实用程序可能因unix而异,因此这类管道有时需要调整…这很聪明-不知道你能做到!很好。理论上我知道,但我从来不记得使用bash扩展。(可能值得注意的是,这不适用于所有shell…)原始的bourne shell csh不知道ksh…所有unix都不运行bash。对于单个用户,
正常运行时间
输出为“1个用户”,因此与上面的“用户”(复数)不匹配。将其更改为“用户”这似乎是可行的。要匹配
用户
用户
,您可以将正则表达式的结尾更改为
…用户?*$
。但是,由于
*$
将所有内容匹配到行尾,只需省略
s
,正如@PeterGibson所建议的,给
…user.*$
就可以了。如果正常运行时间小于一天一次,这将输出类似
5:04,1
的内容,反映5小时4分钟,一个用户登录。这应该更高。这是唯一一个首先使用/proc/uptime获得一致数据格式的解决方案。