
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
使い方
代替コマンドを 1 つ使用します。
s/.*(up.*), [[:digit:]]+ user.*/\1/
最初のもの
.*
は行の先頭から一致します。(up.*)
単語 up とそれに続くテキストを一致させてグループ 1 に保存します。, [[:digit:]]+ users
カンマ、スペース、1 つ以上の数字、スペース、文字列が続くパターンに一致しますusers
。2 番目は
.*
の後のすべてに一致します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