読者です 読者をやめる 読者になる 読者になる

leopardgeckoのブログ

Macの関連事項など

GeekToolで稼働時間をスマートに表示する。

Mac GeekTool

GeekToolで稼働時間を表示するためには、uptimeの出力からawkを使って必要なフィールドを拾ってくるスクリプトが一般的だろうと思います。

例えばこういうものです。

uptime | awk '{print "UPTIME: " $3 " " $4 " " $5}'

このシンプルなスクリプトでは稼働時間が1日以上経過している場合は時間だけ表示できるのですが、それ未満の場合では余計なものまで表示してしまいます。例えば稼働時間が1時間31分の場合は以下のようになってしまいます。

UPTIME: 1:31, 2 users,

上の表示はまだ許容範囲かもしれませんが、1時間未満の場合はさらに表示が崩れて意味不明となってしまいます。

UPTIME: 21 mins, 2 

そのくらいは気にしないというならばこのままでも良いのですが、きれいに時間だけ表示させてスッキリしたいというニーズもあろうかと思い素人ながらに頭をひねってみました。

 

uptimeの出力は1日以上経過していない場合では以下のような感じ。

12:11  up 1:31, 2 users, load averages: 1.38 1.41 1.44
11:02  up 21 mins, 2 users, load averages: 1.32 1.56 2.09

1日以上経過している場合は以下のようなフォーマットになります。

10:09  up 3 days,  14:28, 2 users, load averages: 1.34 1.50 1.48

フィールド数が違う上にスペースが入るパターンも違うので、単純に3〜5番目のフィールドを抜き出すと最後のパターン以外の時は表示が崩れてしまうことがお分かりになるだろうと思います。 

 

余計なものが混じらないようにするスクリプトの流れを考えてみます。

uptimeで最初に出力される現在時刻と「up 」という文字は不要なので、まずawkで「up 」を区切り文字に指定して、そこから先のフィールドを抜き出します。問題はその次で、時間表示のフォーマットがバラバラである上にコンマの後に来るものがユーザー数だったり時間だったりします。とりあえずawkでコンマ区切りのフィールドとして最初の二つを取得しておいて、二つ目のフィールドに「user」という文字列が含まれる場合はフィールドごと削除してしまうという動作にしてみます。

それをスクリプトで書いてみるとこんな感じになります。

uptime | awk -F'up ' '{print $2}' | awk -F, '{if($2 ~ /user/)$2="";print "Uptime: "$1 $2}'
UPTIME: 1:31
UPTIME: 21 mins
UPTIME: 3 days  14:28

Terminalにそのままコピペしても使えますので試してみてください。

(2016年12月12日 追記:当初は最初のフィールドの抜き出しにcutを使っていたが、uptimeのスペースの数は一定ではないようなのでawkで区切り文字を指定する方法に変更)