Text-Processing
僅解析持續時間的“正常執行時間”
當我在我的 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") }