ユーザーがネットワークにログイン/ログアウトするセッションを記録するログファイルがあります。
[10:21:10] User logged in
[13:59:42] User logged out
[15:42:00] User logged in
[16:42:13] User logged out
[11:15:02] User logged in
[11:42:23] User logged out
すべてのユーザーがオンラインで費やした合計時間を計算したいと思います。上記のログファイルは実際には非常に長いです。これは単なる例です。
この例では5:06:06時間です。
答え1
sed
次の操作を試すことができますawk
。
cat file | sed -r 'N; s/\n/ /; s/] User logged [^ ]+//g; y/[:/ /' | awk '{s += ($4-$1)*3600 + ($5-$2)*60 + $6-$3}END {printf "%d:%02d:%02d\n", s/3600, s/60%60, s%60}'
5:06:06
sed
各ユーザーの「ログイン」と「ログアウト」の時間範囲が並べ替えられ、その列awk
で時間計算が実行されます。
答え2
システムが提供している場合は、プロセス置換で読み取った(ファイル入力)オプションとdate
組み合わせて、-f
秒と単純なawk
合計を得ることもできます。
date -f <(cut -c2-9 file1) +%s | awk '{getline X; SUM += X - $0} END {printf "%02d:%02d:%02d\n", SUM/3600, SUM/60%60, SUM%60}'
05:06:06