17

マシンの現在のランタイムを取得するために、bash でアップタイムを使用しています。時間を取得して、2 日、12 時間、23 分などの形式で表示する必要があります。

4

8 に答える 8

36

次のuptimeような出力が生成されます。

$ uptime
 12:49:10 up 25 days, 21:30, 28 users,  load average: 0.50, 0.66, 0.52

それをあなたのフォーマットに変換するには:

$ uptime | awk -F'( |,|:)+' '{print $6,$7",",$8,"hours,",$9,"minutes."}'
25 days, 21 hours, 34 minutes.

使い方

  • -F'( |,|:)+'

    awk は入力をフィールドに分割します。これは awk に、1 つまたは複数のスペース、カンマ、またはコロンの任意の組み合わせをフィールド セパレータとして使用するように指示します。

  • print $6,$7",",$8,"hours,",$9,"minutes."

    これは awk に (スペースで区切られた) 6 番目のフィールドと 7 番目のフィールドを出力し、その後にカンマ、8hours,番目のフィールド、9 番目のフィールドに文字列、最後に stringを出力するように指示しますminutes.

sed を使用して稼働時間の短いコンピューターを処理する

再起動から開始すると、次のuptimeような出力が生成されます。

 03:14:20 up 1 min,  2 users,  load average: 2.28, 1.29, 0.50
 04:12:29 up 59 min,  5 users,  load average: 0.06, 0.08, 0.48
 05:14:09 up  2:01,  5 users,  load average: 0.13, 0.10, 0.45
 03:13:19 up 1 day, 0 min,  8 users,  load average: 0.01, 0.04, 0.05
 04:13:19 up 1 day,  1:00,  8 users,  load average: 0.02, 0.05, 0.21
 12:49:10 up 25 days, 21:30, 28 users,  load average: 0.50, 0.66, 0.52

次のsedコマンドは、これらの形式を処理します。

uptime | sed -E 's/^[^,]*up *//; s/, *[[:digit:]]* users.*//; s/min/minutes/; s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/' 

上記の時間で、これは以下を生成します。

1 minutes
59 minutes
2 hours, 1 minutes
1 day, 0 minutes
1 day,  1 hours, 0 minutes
25 days, 21 hours, 30 minutes

使い方

  • -E拡張正規表現構文をオンにします。(古い GNU sed では、代わりに使用-rします-E)

  • s/^[^,]*up *//

    この代用コマンドは、 までのすべてのテキストを削除しますup

  • s/, *[[:digit:]]* users.*//

    この代替コマンドは、ユーザー数とそれに続くすべてのテキストを削除します。

  • s/min/minutes/

    これは に置き換えminられminutesます。

  • s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/'

    行に hh:mm 形式の時刻が含まれている場合、これにより時と分が分離され、 に置き換えられhh hours, mm minutesます。

awk を使用して稼働時間の短いコンピューターを処理する

uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'

上記と同じテスト ケースでは、次のようになります。

0 days, 0 hours, 1 minutes.
0 days, 0 hours, 59 minutes.
0 days, 2 hours, 1 minutes.
1 days, 0 hours, 0 minutes.
1 days, 1 hours, 0 minutes.
25 days, 21 hours, 30 minutes.

複数行にまたがる awk コードを好む人向け:

uptime | awk -F'( |,|:)+' '{
    d=h=m=0;
    if ($7=="min")
        m=$6;
    else {
        if ($7~/^day/) { d=$6; h=$8; m=$9}
        else {h=$6;m=$7}
        }
    }
    {
        print d+0,"days,",h+0,"hours,",m+0,"minutes."
    }'
于 2015-02-05T20:53:54.987 に答える
6

解決策: Linux の稼働時間を秒単位で取得するには、bash に移動してcat /proc/uptime.Parse と入力し、最初の数値を必要に応じて変換します。

RedHatのドキュメントから:

このファイルには、システムが最後に再起動してからの経過時間に関する詳細な情報が含まれています。の出力/proc/uptimeはごくわずかです。

350735.47 234388.90

最初の数字は、システムが稼働していた合計秒数です。

2 番目の数値は、マシンがアイドル状態にあった時間 (秒単位) です。

于 2020-07-14T13:55:54.313 に答える
1

多様性のために、sed の例を次に示します。

私の生の出力:

$ uptime
15:44:56 up 3 days, 22:58,  7 users,  load average: 0.48, 0.40, 0.31

変換後の出力:

$uptime|sed 's/.*\([0-9]\+ days\), \([0-9]\+\):\([0-9]\+\).*/\1, \2 hours, \3 minutes./'
3 days, 22 hours, 58 minutes.
于 2015-02-06T07:47:55.377 に答える
0

この回答は、OS X に同梱されているものにかなり固有のものですがuptime、出力のあらゆるケースを考慮しています。

#!/bin/bash

INFO=`uptime`
echo $INFO | awk -F'[ ,:\t\n]+' '{
        msg = "↑ "
        if ($5 == "day" || $5 == "days") {      # up for a day or more
            msg = msg $4 " " $5 ", "

            n = $6
            o = $7
        } else {
            n = $4
            o = $5
        }

        if (int(o) == 0) {                      # words evaluate to zero
            msg = msg int(n)" "o
        } else {                                # hh:mm format
            msg = msg int(n)" hr"
            if (n > 1) { msg = msg "s" }

            msg = msg ", " int(o) " min"
            if (o > 1) { msg = msg "s" }
        }

        print "[", msg, "]"
    }'

可能な出力の例:

22:49 up 24 secs, 2 users, load averages: 8.37 2.09 0.76
[ ↑ 24 secs ]

22:50 up 1 min, 2 users, load averages: 5.59 2.39 0.95
[ ↑ 1 min ]

23:39 up 51 mins, 3 users, load averages: 2.18 1.94 1.74
[ ↑ 51 mins ]

23:54 up 1:06, 3 users, load averages: 3.67 2.57 2.07
[ ↑ 1 hr, 6 mins ]

16:20 up 120 days, 10:46, 3 users, load averages: 1.21 2.88 0.80
[ ↑ 120 days, 10 hrs, 46 mins ]
于 2016-02-01T03:51:32.410 に答える