シェルでは時間の形式になっている2行を引く必要があります。時間の形式はhh:mm:ssです。以下のコードを使用して時間を取得しました。
cat /var/log/kern.log |grep usb |tail -2| awk '{print $3}'
上記のコードの出力は
18:23:24
18:20:20
秒単位で違いを見つけるにはどうすればよいですか?
私はさらに一歩踏み出します( この投稿 に触発されました):
# => 18:23:24 --> 66204
grep usb /var/log/kern.log|tail -2|awk '{print $3}'|awk -F: '{print ($1 * 3600) + ($2 * 60) + $3 }'
だから、私が持っていた後:
66204
66020
その後、次のことができます。
echo $((66204-66020)) # => 184
異なる日付の時間でも機能するため、より一般的な解決策:
echo "18:23:24
18:20:20" |
(read later_time; read former_time;
former_seconds=$(date --date="$former_time" +%s);
later_seconds=$(date --date="$later_time" +%s);
echo $((later_seconds-former_seconds)) )
184
awk
を使用すると、1回の呼び出しで実行できます
awk '
/usb/{
("date +%s -d "$3)|getline t[++i];
}
END{
print t[i-1]-t[i];
}' /var/log/kern.log
不要なパイプがたくさんない、awkのパイプライン全体。
costasに似ていますが、外部コマンドを使用しません。
awk '/usb/{split($3,a,":");b[++x]=(a[1]*3600)+(a[2]*60)+a[3]}END{print b[x-1]-b[x]}' /var/log/kern.log
パイプを保持することにした場合は、日付の最後のビットがうまくいきました
awk '{split($1,a,":");b[x++]=(a[1]*3600)+(a[2]*60)+a[3]}END{print b[0]-b[1]}'