経過時間を秒単位で分析したい。時間形式は次のとおりです。
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 18h
or3 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数値の日付/時刻として表示します。これはエポック以降の秒数です。これは文字列の間隔(増分)値に対応します。h
hr
h
hour
@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"}'