Как найти общее время, проведенное на моем ноутбуке в этом году?

17

Мне интересно узнать, сколько времени я трачу на мой ноутбук в 2016 году.

last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep  -v '-'

дает мне общее время работы ноутбука в этом формате:

(01:33) 
(04:40) 
(01:31) 
(1+06:41) 
(02:47) 
(00:30)

Теперь, как я могу добавить его?

    
задан daltonfury42 22.12.2016 в 05:55
источник

3 ответа

5

Вот версия 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
        }'
Последний столбец

last находится в формате (<days>+hours:minutes) , где days+ отбрасывается, если период меньше 1 дня.

Здесь первая команда awk выводит последний столбец, продолжительность интереса, для reboot записей.

Для второй команды awk :

  1. FS [(+:)] , то есть скобки или + или : . Таким образом, (h:m) разделяется на , h , m и (первый и последний поля пустые), а (d+h:m) разделяется на , d , h ,% m и (опять же, первый и последний поля пустые).
  2. Затем мы берем второе поле в течение минут, третье - в течение часа и четвертое - в течение нескольких дней. Четвертое поле будет первым, пустым полем, если дней нет. Итак, мы просто добавим 0 в этом случае.
  3. Затем мы набираем часы и дни, если минуты и часы превышают 60 и 24 соответственно. Обратите внимание, что awk выполняет деление с плавающей запятой, поэтому h и d теперь могут иметь дробные части.
  4. Затем мы печатаем числа как целые числа ( %d ), поэтому любая дробная часть игнорируется.
ответ дан muru 22.12.2016 в 11:39
источник
8

Попытка с помощью скрипта bash и расширение вашей команды. Я использую dateutils , чтобы добавить продолжительность времени.

Следовательно, для использования этого скрипта необходим пакет dateutils , доступный через apt . ( sudo apt install dateutils )

Этот сценарий также учитывает текущее время безотказной работы (нынешняя сессия), следовательно, более точный. Секунды не учитываются. Самый низкий показатель - минут.

#!/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,\}\))/dhm/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/hm/g'  )
curr=$( cat /proc/uptime |  perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int(/86400),int((%86400)/3600),int((%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 .
  • Исходная фальшивая дата устанавливается как org = 2015-01-01 , к которой добавляется текущее время безотказной работы.
  • Затем все кумулятивные периоды времени добавляются к переменной new
  • Продолжительность между org и временем безотказной работы new определяется разницей.

Вывод:

[email protected]:$ ./uptime_record.sh
Total run time (days:hours:minutes)
57d 20h 36m

Следующий сценарий предназначен для безотказной работы ровно один год со дня запуска скрипта .

#!/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,\}\))/dhm/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/hm/g'  )
curr=$( cat /proc/uptime |  perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int(/86400),int((%86400)/3600),int((%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"
    
ответ дан ankit7540 22.12.2016 в 08:59
5

Вот реализация python того, что я хочу, но я уверен, что есть элегантный способ сделать это с 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))
    
ответ дан daltonfury42 22.12.2016 в 10:39