期間に対してのみ「稼働時間」を解析します。

期間に対してのみ「稼働時間」を解析します。

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

関連情報