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