web-dev-qa-db-ja.com

「稼働時間」をその期間だけ解析します

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文字を削除する必要があります。誰かが私を教育できますか?

2
tony

試してください:

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バージョン

$ Perl -pe 's/.*(up.*), [[:digit:]]+ user.*/$1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min
1
John1024

私はこれを使用します(必要に応じてユニットを含めるように適合させます):

#!/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
jasonwryan