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
カンマ、スペース、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