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获得一致数据格式的解决方案。