Здесь вы найдете надежный способ, который преобразует вашу продолжительность в общее количество секунд. Это надежно, так как не требуется перечислять все количества. Т.е. выход может быть любым из следующих:
System uptime: 16 minutes, 2 seconds
System uptime: 12 days, 3 seconds
System uptime: 15minutes,12hours
Создать файл convert.awk
, который содержит
BEGIN { a["seconds"]=1; a["minutes"]=60
a["hours"]=3600; a["days"]=86400;
a["weeks"]=7*86400 }
{ tmp=tolower($0) }
{ while (match(tmp,/[0-9]+[^a-z]*[a-z]+/)) {
u=substr(tmp,RSTART,RLENGTH); q=u+0; gsub(/[^a-z]/,"",u)
t+=q*a[u]
tmp=substr(tmp,RSTART+RLENGTH)
}
print t
}
Запуститьследующая команда:
$ echo "System uptime: 2 days, 9 hours, 16 minutes, 5 seconds" | awk -f convert.awk
206165
$ echo "System uptime: 2 weeks, 9 days, 16 minutes, 5 seconds" | awk -f convert.awk
1988165
Как это работает:
Когда мы читаем строку, например.
tmp="system uptime: 16 minutes, 2 seconds"
Команда match
будет искать любую подстроку, которая начинается с цифр и заканчивается строкой символов. match
автоматически установит переменные RSTART
и RLENGTH
в положение найденной подстроки и ее длину. Таким образом, команда u=substr(tmp,RSTART,RLENGTH)
установит
u="16 minutes"
Теперь вы можете просто выполнить операцию над ней, чтобы извлечь первое число. Это работает с awk, так как преобразует любую строку, начинающуюся с чисел, в число, игнорируя что-либо после него. Итак, q=u+0
создает
q=16
Наконец, мы удаляем все, что не является символом из u
, что приводит к
u="minutes"
. Следующим шагом мы переопределяем tmp
, удаляя всемы уже обработали.
tmp=", 2 seconds"
и начнем процесс заново.