仅解析持续时间的“正常运行时间”

仅解析持续时间的“正常运行时间”

当我在 Mac 上运行命令“uptime”时,我得到以下输出:

19:52  up 14 mins, 2 users, load averages: 2.95 4.19 4.31

这会根据系统运行的时间而略有变化,先增加几小时,然后增加几天。因此我想删除第一个单词加空格,以及“users”之前的 4 个字符。

制作19:52 up 14 mins, 2 users, load averages: 2.95 4.19 4.31

这:

up 14 min

或者

8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40

这:

up 52 days, 20:47

或者:

22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27

这:

up 54 days, 1 min

到目前为止,我能得到的最远的是使用这个:uptime | cut -d " " -f2- | sed 's/users.*//'但这仍然在“up”之前给了我一个空格,而且我仍然需要删除字符串末尾的 4 个字符。有人可以教育我吗?

答案1

我使用这个(如果需要的话可以调整以包含单位):

#!/usr/bin/awk -f

    BEGIN {
      while ("uptime" | getline)
        gsub(/,/,"")
        if (NF==10)
          print $3
        else if (NF==11)
          print $3,$4
        else if (NF==12)
          print $3,$4,$5
        else
          print $3,$4,$5,$6
      close("uptime")
    }

答案2

尝试:

sed -E 's/.*(up.*), [[:digit:]]+ user.*/\1/'

例子

这些是问题中的示例:

$ cat upfile
19:52  up 14 mins, 2 users, load averages: 2.95 4.19 4.31
8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40
22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27

sed 命令生成:

$ sed -E 's/.*(up.*), [[:digit:]]+ user.*/\1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min

怎么运行的

我们使用一个替代命令:

s/.*(up.*), [[:digit:]]+ user.*/\1/
  • 第一个.*匹配从行的开头开始。

  • (up.*)匹配单词 up 和后面的文本并将其保存在组 1 中。

  • , [[:digit:]]+ users匹配一个逗号,后跟一个空格,后跟一个或多个数字,后跟一个空格,最后跟字符串users

  • 第二个.*匹配 以后的所有内容user

我们将所有这些替换为组 1,表示为\1

兼容性

上面的内容应该适用于 BSD/OSX 和现代 Linux。在非常旧的 Linux 上,可能需要替换-E-r

sed -r 's/.*(up.*), [[:digit:]]+ user.*/\1/'

Perl版本

$ perl -pe 's/.*(up.*), [[:digit:]]+ user.*/$1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min

相关内容