【Mac】PCの起動・停止時刻を出力するシェルスクリプト


■環境

macOS High Sierra 10.13.1
bash 4.4.12


職場の勤怠を付ける際に数日分まとめて入力するのですが、
出勤退勤時刻の目安とするため、Macの起動・停止時刻を出すようにしました。

まず、このシェルスクリプトはbash Ver 4.x.x台以上でないと動かないので、
bashのバージョンが3の場合はHomebrewでインストールします。
※執筆時点でMacにデフォルトで入っているbashはVer 3.x.xでした。

$ brew install bash  
$ which bash  
/usr/local/bin/bash

シェルスクリプトを作成します。
仮でホームディレクトリ直下に「kintai.sh」という名前で作る事にします。

$ vim ~/kintai.sh  

シェルの内容は以下の通りです。
シバン(1行目のやつ)のパスは上記のwhichコマンドで確認したbashのパスとします。

#!/usr/local/bin/bash  
set +e  
  
declare -A rebootTimes  
declare -A shutdownTimes  
  
shutdownList=`last | grep "^shutdown" | cut -d " " -f 28-33`  
while read line;  
do  
    curdate=`env LANG=eu_US.UTF-8 date -j -f "%a %b %d %H:%M" "${line}" "+%Y/%m/%d"`  
    curtime=`env LANG=eu_US.UTF-8 date -j -f "%a %b %d %H:%M" "${line}" "+%H:%M"`  
    if [ ${#shutdownTimes[${curdate}]} -eq 0 ]; then  
        shutdownTimes[${curdate}]=${curtime}  
    fi  
done << END  
$shutdownList  
END  
  
rebootList=`last | grep "^reboot" | cut -d " " -f 30-35`  
while read line;  
do  
    curdate=`env LANG=eu_US.UTF-8 date -j -f "%a %b %d %H:%M" "${line}" "+%Y/%m/%d"`  
    curtime=`env LANG=eu_US.UTF-8 date -j -f "%a %b %d %H:%M" "${line}" "+%H:%M"`  
    rebootTimes[${curdate}]=${curtime}  
done << END  
$rebootList  
END  
  
firstDate=`date +"%Y/%m/01"`  
today=`date +"%d"`  
  
firstDate="2017/12/01"  
  
for ((i=0; i < ${today}; i++)); do  
    target=`date -v+${i}d -j -f "%Y/%m/%d" "${firstDate}" +"%Y/%m/%d"`  
    echo "${target} : ${rebootTimes[${target}]} - ${shutdownTimes[${target}]}"  
done

あとはこのシェルに実行権限をつけて実行するだけです。

$ chmod +x ~/kintai.sh  
$ ~/kintai.sh  
2017/12/01 : 10:14 - 19:16  
2017/12/02 :  -  
2017/12/03 :  -  
2017/12/04 : 10:10 - 20:01  
2017/12/05 : 10:06 - 18:44  
2017/12/06 : 09:48 - 18:21  
2017/12/07 : 11:22 - 15:18  
2017/12/08 : 09:47 - 19:07  
2017/12/09 :  -  
2017/12/10 :  -  
2017/12/11 : 10:06 - 19:53  
2017/12/12 : 10:12 -  

起動時刻はその日に最初に起動した時刻、停止時刻はその日最後に停止した時刻を出力しています。
日を跨いで仕事をした場合は、どうしようもないです。