Text-Processing

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

  • December 2, 2017

當我在我的 Mac 上執行命令“uptime”時,我得到以下輸出:

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

這會根據系統啟動的時間略有變化,增加幾小時然後幾天。因此,我想刪除第一個單詞加空格,以及“使用者”之前的 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.*//'但這仍然在“向上”之前給了我一個空格,我仍然需要刪除字元串末尾的 4 個字元。有人可以教育我嗎?

嘗試:

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

我使用它(如果需要,可以適應包括單位):

#!/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")
   }

引用自:https://unix.stackexchange.com/questions/408321