`uptime` を解析して期間だけ調べる

`uptime` を解析して期間だけ調べる

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

関連情報