Как сделать разбор затраченного времени в секундах в Linux - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу выполнить анализ прошедшего времени в секундах. Форматы времени приведены ниже:

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

, теперь А имеет ввод как 3 дня 18 часов или 3 дня и т. д. Больше примеров -

А = 3 дня 18 часов или 3 дня или 3 часа 15 минут или 3 часа или15 минут 10 секунд или 15 минут или 10 секунд

теперь принимают различные значения A и анализируют в секундах.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Использование awk для s/h/hours/ и запуск date +"%s" -d "1970-01-01 GMT +" для анализа строк времени и подсчета секунд:

$ awk '{
    sub(/h/,"hours")                                          # date no eat h
    $1=""                                                     # remove $1
    "date +\"%s\" -d \"1970-01-01 GMT + " $0 "\"" | getline s # date
    print s 
}' file
324000
259200
11700
10800
910
900
10

для данных:

$ cat file
1) 3 day 18h
2) 3 day
3) 3h 15min
4) 3h 
5) 15min 10sec
6) 15min 
7) 10sec
0 голосов
/ 25 апреля 2018

То, чего вы хотите достичь, можно сделать непосредственно в awk, используя следующую строку:

$ systemctl status cassandra | awk '/(Active: active)/{s=$6" "$7;gsub(/-|:/," ",s); print systime() - mktime(s)}'

Это даст вам время работы непосредственно на основе времени запуска, а не на приблизительном времени работы, напечатанном systemctl.

Если этот подход не работает, тогда я предлагаю использовать команду date, чтобы выполнить весь анализ. Если вы можете изменить h на hour в своих примерах, то вы можете сделать следующее:

$ date -d "1970-01-01 + 3day 18hour 15min 16sec" +%s
324916

Если вы не можете, тогда я предлагаю следующее. Если длительность хранится в переменной $duration, тогда вы делаете

$ date -d "1970-01-01 + ${duration/h/hour}" +%s

Наличие пробелов между числами и строками day, h, min или sec не имеет значения.

Идея этого в том, что вы просите date вычислить все для вас, поскольку %s возвращает время unix с 1970-01-01 в секундах.

man date %s секунды с 1970-01-01 00:00:00 UTC

0 голосов
/ 25 апреля 2018

Заданное значение A равно *:

A="3day 3day/3h 15min/3h/15min 10sec/15min/10sec"

Для вычисления A в секундах вы можете использовать расширение параметра bash:

A=${A//day/*86400}                                                       
A=${A//h/*3600}                                                          
A=${A//min/*60}                                                          
A=${A//sec/*1}                                                           
A=${A//\//+}                                                             
A=${A// /+}                                                              
echo "A = $A"                                                            
echo $A | bc                                                             

Выход:

A = 3*86400+3*86400+3*3600+15*60+3*3600+15*60+10*1+15*60+10*1            
542720                                                                  

* Обратите внимание, здесь я изменил исходное значение A, как указано в OP. От

3 day/3 day/3h... 

до

3day 3day/3h... # the rest is the same as OP's.
...