マシンの現在のランタイムを取得するために、bashで稼働時間を使用しています。時間を取得して、2日、12時間、23分などの形式を表示する必要があります。
私の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番目のフィールド(スペースで区切る)を印刷し、その後にコンマ、8番目のフィールド、文字列_hours,
_、9番目のフィールド、最後に文字列_minutes.
_が続きます。
再起動から開始すると、私の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 sedsでは、_-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
_に置き換えられます。
_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."
}'
_
完全を期すために...
$ uptime -p
up 2 weeks, 3 days, 14 hours, 27 minutes
このため:
もっと簡単です:uptime -p | cut -d " " -f2-
多様性のために、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.
この回答は、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 ]