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