uptime -p
をサポートするシステム用のユニバーサル シェル スクリプトを作成しました。 新しい Linux のように、Mac OS X のようにそうでないもののために。
#!/bin/sh
uptime -p >/dev/null 2>&1
if [ "$?" -eq 0 ]; then
# Supports most Linux distro
# when the machine is up for less than '0' minutes then
# 'uptime -p' returns ONLY 'up', so we need to set a default value
UP_SET_OR_EMPTY=$(uptime -p | awk -F 'up ' '{print $2}')
UP=${UP_SET_OR_EMPTY:-'less than a minute'}
else
# Supports Mac OS X, Debian 7, etc
UP=$(uptime | sed -E 's/^[^,]*up *//; s/mins/minutes/; s/hrs?/hours/;
s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/;
s/^1 hours/1 hour/; s/ 1 hours/ 1 hour/;
s/min,/minutes,/; s/ 0 minutes,/ less than a minute,/; s/ 1 minutes/ 1 minute/;
s/ / /; s/, *[[:digit:]]* users?.*//')
fi
echo "up $UP"
要旨
独自のカスタマイズで John1024 の回答を参照しました。
私の 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.
.
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."
}'
解決策 :Linux の稼働時間を秒単位で取得するには、bash に移動して cat /proc/uptime
と入力します .最初の数値を解析し、必要に応じて変換します。
RedHat のドキュメントから:
<ブロック引用>
このファイルには、前回の再起動以降のシステムの稼働時間に関する詳細情報が含まれています . /proc/uptime
の出力 非常に最小限です:
350735.47 234388.90
最初 number は、システムが稼働していた合計秒数です。
2番目 number は、マシンがアイドルに費やした時間 (秒単位) です。
完全性のためだけに...どうしたものか:
$ uptime -p
up 2 weeks, 3 days, 14 hours, 27 minutes