web-dev-qa-db-ja.com

シェルで2回引く方法

シェルでは時間の形式になっている2行を引く必要があります。時間の形式はhh:mm:ssです。以下のコードを使用して時間を取得しました。

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

上記のコードの出力は

18:23:24
18:20:20

秒単位で違いを見つけるにはどうすればよいですか?

3
Rakesh R Nair

私はさらに一歩踏み出します( この投稿 に触発されました):

# => 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
8
David Weiser

異なる日付の時間でも機能するため、より一般的な解決策:

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
4
Hauke Laging

awkを使用すると、1回の呼び出しで実行できます

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

不要なパイプがたくさんない、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]}'
0
user78605