Como subtrair duas vezes no shell

2

Eu preciso subtrair duas linhas que estão no formato de tempo no shell. O formato da hora é hh: mm: ss Eu usei o código abaixo para ganhar tempo.

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

A saída do código acima é

18:23:24
18:20:20

Como posso encontrar a diferença em segundos?

    
por Rakesh R Nair 10.11.2014 / 18:21

4 respostas

7

Eu daria mais um passo (inspirado em este post ):

# => 18:23:24 --> 66204
grep usb /var/log/kern.log|tail -2|awk '{print $3}'|awk -F: '{print ($1 * 3600) + ($2 * 60) + $3 }'

Então, depois que eu tive:

66204
66020

Você poderia então fazer:

echo $((66204-66020)) # => 184
    
por 10.11.2014 / 18:32
3

Uma solução mais geral, pois também funciona com horários de datas diferentes:

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
    
por 10.11.2014 / 18:39
0

Se você usa awk , você pode fazer isso em uma invocação

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

Seu pipeline inteiro em awk sem muitos tubos desnecessários.
Semelhante às costas, mas sem usar comandos externos.

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

Heres apenas o último bit com as datas funcionou se você decidir manter os tubos

 awk '{split($1,a,":");b[x++]=(a[1]*3600)+(a[2]*60)+a[3]}END{print b[0]-b[1]}'
    
por 11.11.2014 / 00:58