gpt4 book ai didi

linux - Bash 格式正常运行时间以显示天、小时、分钟

转载 作者:IT王子 更新时间:2023-10-29 00:26:01 26 4
gpt4 key购买 nike

我在 bash 中使用正常运行时间来获取机器的当前运行时间。我需要抓取时间并显示类似 2 天 12 小时 23 分钟的格式。

最佳答案

我的 uptime 产生如下所示的输出:

$ uptime
12:49:10 up 25 days, 21:30, 28 users, load average: 0.50, 0.66, 0.52

将其转换为您的格式:

$ uptime | awk -F'( |,|:)+' '{print $6,$7",",$8,"hours,",$9,"minutes."}'
25 days, 21 hours, 34 minutes.

工作原理

  • -F'( |,|:)+'

    awk 将其输入分成字段。这告诉 awk 使用一个或多个空格、逗号或冒号的任意组合作为字段分隔符。

  • 打印 $6,$7",",$8,"小时,",$9,"分钟。"

    这告诉 awk 打印第六个字段和第七个字段(用空格分隔)后跟逗号、第 8 个字段、字符串 hours、 第九个字段,最后是字符串分钟。

使用 sed 处理正常运行时间较短的计算机

从重启开始,我的正常运行时间产生如下输出:

 03:14:20 up 1 min,  2 users,  load average: 2.28, 1.29, 0.50
04:12:29 up 59 min, 5 users, load average: 0.06, 0.08, 0.48
05:14:09 up 2:01, 5 users, load average: 0.13, 0.10, 0.45
03:13:19 up 1 day, 0 min, 8 users, load average: 0.01, 0.04, 0.05
04:13:19 up 1 day, 1:00, 8 users, load average: 0.02, 0.05, 0.21
12:49:10 up 25 days, 21:30, 28 users, load average: 0.50, 0.66, 0.52

以下 sed 命令处理这些格式:

uptime | sed -E 's/^[^,]*up *//; s/, *[[:digit:]]* users.*//; s/min/minutes/; s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/' 

有了上面的时间,这会产生:

1 minutes
59 minutes
2 hours, 1 minutes
1 day, 0 minutes
1 day, 1 hours, 0 minutes
25 days, 21 hours, 30 minutes

工作原理

  • -E 打开扩展正则表达式语法。 (在较旧的 GNU seds 上,使用 -r 代替 -E)

  • s/^[^,]*up *//

    此替换命令删除所有文本直到 up

  • s/, *[[:digit:]]* users.*//

    此替换命令删除用户计数及其后的所有文本。

  • 秒/分/分钟/

    这会将 min 替换为 minutes

  • s/([[:digit:]]+):0?([[:digit:]]+)/\1 小时,\2 分钟/'

    如果该行包含 hh:mm 格式的时间,这会将小时与分钟分开,并将其替换为 hh hours, mm minutes

使用 awk 处理正常运行时间较短的计算机

uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'

在与上面相同的测试用例中,这会产生:

0 days, 0 hours, 1 minutes.
0 days, 0 hours, 59 minutes.
0 days, 2 hours, 1 minutes.
1 days, 0 hours, 0 minutes.
1 days, 1 hours, 0 minutes.
25 days, 21 hours, 30 minutes.

对于那些喜欢将 awk 代码分散到多行的人:

uptime | awk -F'( |,|:)+' '{
d=h=m=0;
if ($7=="min")
m=$6;
else {
if ($7~/^day/) { d=$6; h=$8; m=$9}
else {h=$6;m=$7}
}
}
{
print d+0,"days,",h+0,"hours,",m+0,"minutes."
}'

关于linux - Bash 格式正常运行时间以显示天、小时、分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28353409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com