シェルで2つの減算を実行する方法

シェルで2つの減算を実行する方法

シェルから2行の時間形式を減算する必要があります。時間形式はhh:mm:ssです。次のコードを使用して時間を取得します。

cat /var/log/kern.log |grep usb |tail -2| awk '{print $3}'

上記のコードの出力は次のとおりです。

18:23:24
18:20:20

秒単位で違いをどのように見つけることができますか?

答え1

私はもっ​​と進むでしょう(インスピレーション:この投稿):

# => 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

答え2

より一般的な解決策は他の日付の時刻にも機能するため、次のようになります。

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

答え3

以下を使用すると、awk1回の通話でこれを行うことができます。

awk '
/usb/{
("date +%s -d "$3)|getline t[++i];
}
END{
print t[i-1]-t[i];
}' /var/log/kern.log

答え4

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]}'

関連情報