Je suis intéressé à connaître le temps total passé sur mon ordinateur portable en 2016.
last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep -v '-'
me donne la disponibilité totale de l'ordinateur portable dans ce format:
(01:33)
(04:40)
(01:31)
(1+06:41)
(02:47)
(00:30)
Maintenant, comment puis-je l'additionner?
Voici une version de awk + awk:
last ... | awk '/reboot/{print $NF}' |
awk -F '[(+:)]' '
{
d += $(NF - 3); h += $(NF - 2); m += $(NF - 1)
}
END {
carry = m / 60; h += carry;
carry = h / 24; d += carry;
printf "%d days, %d hours, %d minutes\n", d, h % 24, m % 60
}'
La dernière colonne de last
est au format (<days>+hours:minutes)
, où days+
est supprimé si la période est inférieure à 1 jour.
Ici, la première commande awk
affiche la dernière colonne, la durée d'intérêt, pour les entrées reboot
.
Pour la deuxième commande awk
:
FS
est [(+:)]
, c'est-à-dire entre parenthèses o+
o:
. Donc, (h:m)
est divisé en, h
, m
et (premier et dernier champs vides), et (d+h:m)
est divisé en, d
, h
, m
et (encore une fois, le premier et le dernier champs sont vides).0
dans ce cas.h
et d
peuvent maintenant avoir des fractions.%d
), de sorte que toute partie décimale est ignorée.Essayer avec le script bash et étendre votre commande. J'utilise dateutils
pour additionner la durée.
Par conséquent, pour utiliser ce script, il vous faut le paquetage dateutils
disponible via apt
. (Sudo apt install dateutils
)
Ce script prend en compte le temps de disponibilité actuel (session actuelle) également, donc plus précis. Les secondes ne sont pas comptées. L'unité la plus basse rapportée est la minute.
#!/bin/bash
# Total uptime reported.
temp=$(last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep -v '-' | sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1d\2h\3m/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g' )
curr=$( cat /proc/uptime | Perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int($1/86400),int(($1%86400)/3600),int(($1%3600)/60)' )
echo "Total run time (days:hours:minutes)"
curr="2015-01-01T"$curr
org="2015-01-01T00:00:00"
new=$(dateutils.dadd $curr $temp )
dateutils.ddiff $org $new -f "%dd %Hh %Mm"
temp
.2015-01-01
, à laquelle la disponibilité actuelle est ajoutée.new
org
et la disponibilité nette new
est obtenue par différence.Sortie:
vayu@helix:$ ./uptime_record.sh
Total run time (days:hours:minutes)
57d 20h 36m
Le script suivant concerne le temps de disponibilité exactement n an à compter du jour où le script est exécuté.
#!/bin/bash
# Total uptime reported since exactly 1 year (from the time script is run).
now="$(date +'%Y-%m-%d')" ;
last_y=$(dateutils.dadd $now -1y)
temp=$(last reboot --since "$last_y" --until "$now" | grep -o '(.*)' | grep -v '-' | sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1d\2h\3m/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g' )
curr=$( cat /proc/uptime | Perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int($1/86400),int(($1%86400)/3600),int(($1%3600)/60)' )
echo "Total run time in one year (days:hours:minutes)"
curr="1980-01-01T"$curr
org="1980-01-01T00:00:00"
new=$(dateutils.dadd $curr $temp )
dateutils.ddiff $org $new -f "%dd %Hh %Mm"
Voici une implémentation de python de ce que je veux, mais je suis sûr qu'il existe un moyen élégant de le faire avec bash:
import subprocess
output = subprocess.run("last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep -v '-'| sed -e 's/(//g; s/)//g; s/+/:/g'", Shell=True, stdout=subprocess.PIPE, universal_newlines=True)
mins_total = 0
for line in output.stdout.split('\n')[:-1]:
try:
(hrs, mins) = [int(k) for k in line.split(':')]
days = 0
except:
(days, hrs, mins) = [int(k) for k in line.split(':')]
mins_total += (days*24 + hrs)*60 + mins
print("Hours: " + str(mins_total/60))
print("Days: " + str(mins_total/60/24))