Linuxで経過時間を秒単位で解析する方法

Linuxで経過時間を秒単位で解析する方法

経過時間を秒単位で分析したい。時間形式は次のとおりです。

1) 3 day 18h
2) 3 day
3) 3h 15min
4) 3h 
5) 15min 10sec
6) 15min 
7) 10sec

私はそれから価値を得るsystemctl status cassandra | awk '/(Active: active)/{print $9, $10,$11}'次に、次のように変数Aに値を保存します。

A=$(systemctl status cassandra | awk '/(Active: active)/{print $9, $10,$11}'

今Aは3 day 18hor3 dayなどに入ります。その他の例 -

A=3 day 18h or 3 day or 3h 15min or 3h or 15min 10sec or 15min or 10sec

それでは、さまざまなA値を取得して数秒で解析してみてください。

答え1

dateコマンドを使用して、次のようにこれらの値を解析できます。

        adjusted_val="$(printf '%s' "$val" | sed 's/h/hour/')"
        result="$(date -d "$(date -d @0) + $adjusted_val" +%s)"

奇妙なことに、「時間」の略語を(さえ)date認識しないので、最初のステップとして文字列をに置き換えます。次に(Unix Time 0)を文字列に展開して、「Epock Time」(Unix date / time countのdate / time)を見つけます。 (私たち全員が知っているように、レコードは「1970年1月1日00:00:00 GMT」なので、その値をハードコードできます。)その後、文字列を追加します。たとえば、(1月1日)+ 3日(s)は1月4日です。次に、その日付/時刻をUnix数値の日付/時刻として表示します。これはエポック以降の秒数です。これは文字列の間隔(増分)値に対応します。hhrhhour@0+%s

一度に複数の値に対してこれを行うには、エポックを一度だけ計算して最適化できます。

#!/bin/sh
epoch="$(date -d @0)"
for val
do
        adjusted_val="$(printf '%s' "$val" | sed 's/h/hour/')"
        if result="$(date -d "$epoch + $adjusted_val" +%s)"
        then
                printf '%-12s -> %6d\n' "$val" "$result"
        else
                printf '%-12s <- error\n' "$val"
        fi
done

結果:

$ ./myscript '3 day 18h' '3 day' '3h 15min' '3h' '15min 10sec' '15min ' \
                                                       '10sec' 'a moment' '3 weeks'
3 day 18h    -> 324000
3 day        -> 259200
3h 15min     ->  11700
3h           ->  10800
15min 10sec  ->    910
15min        ->    900
10sec        ->     10
date: invalid date ‘Wed, Dec 31, 1969  7:00:00 PM + a moment’
a moment     <- error
3 weeks      -> 1814400

date -d「月」という単語が処理される可能性があることに注意してください。その単語を含む値を取得することが可能な場合は、sed「月」の「h」が変更されないように、コマンドをよりスマートにする必要があります。

しかし、本当に月を扱いたい場合は、「月」が何であるかを本当に考えてみなければなりません。たとえば、私はこの記事を2020年4月12日に書いています。一ヶ月後の5月12日、30日残りました。一ヶ月前が3月12日、だから31日前でした。二ヶ月前の2月12日、だから60(31+29)日前でした。しかし、うるう年ではない年には2月が28日しかないので、2月12日と4月12日は59日しか差がありません。もっと多くのものがあります。つまり23日間隔です。時間。複雑です。

答え2

7日後にはメインパラメータを取得し、30日後には月パラメータを取得するため、日および時間パラメータに依存することはできません。

したがって、サービス開始時間を使用して計算するのが最善です。

#!/bin/bash
SERVICE=cassandra
SERVICE_START_TIME=`systemctl status $SERVICE | awk '/Active: active/{print $6" "$7}'`
SERVICE_UP_TIME=$(($(date +%s) - $(date -d "$SERVICE_START_TIME" +%s)))
echo "$SERVICE uptime : $SERVICE_UP_TIME"

次のコード行を試してみることができますが、正確な結果を得るために上記のコードを使用することをお勧めします。

systemctl status cassandra | awk -F ';' '/Active: active/{print $2}' |  sed -e 's/s ago/ 1/; s/s//g; s/min/ 60/; s/h ago/ 3600/; s/day/86400/; s/week/606800/; s/month/2592000/; s/ago//' | awk '{a=$1*$2;b=$3*$4;c=$a+$b;print a" sec"}'

関連情報