僅解析持續時間的“正常運行時間”

僅解析持續時間的“正常運行時間”

當我在 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

相關內容