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.*//'
しかし、それでも「up」の前にスペースがあり、文字列の最後にある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
1つの代替コマンドを使用します。
s/.*(up.*), [[:digit:]]+ user.*/\1/
最初の.*
は行の先頭から一致します。
(up.*)
は、それに続く単語とテキストを照合し、グループ1に保存します。
, [[:digit:]]+ users
は、コンマ、スペース、1つ以上の数字、スペース、文字列users
の順に一致します。
2番目の.*
は、user
以降のすべてに一致します。
これらすべてを、\1
で示されるグループ1に置き換えます。
上記は、BSD/OSXと最新のLinuxの両方で機能するはずです。非常に古いLinuxでは、-E
を-r
に置き換える必要がある場合があります。
sed -r 's/.*(up.*), [[:digit:]]+ user.*/\1/'
$ 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")
}