如何找到我今年在笔记本电脑上花费的总时间?


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)

现在如何添加它?


你能告诉我(1 + 06:41)的意思吗?
kashish '16

@kashish 1天6时41分钟
muru

事实是,wtmp日志(这是您在last命令输出中看到的)被设置为每月(在中/etc/logrotate.conf)轮换,这意味着在特定时间段之后,最早的日志将被删除。换句话说,无论您想做什么last,都不会很准确
Sergiy Kolodyazhnyy 16/12/22

@Serg我已禁用wtmp的logrotate。自从我这样做已经一年多了,文件大小目前为370万。所以我看不出为什么要每月轮换一次。;)
daltonfury42 '12

@ daltonfury42如果禁用它,它将不会旋转。大多数用户不这样做。
Sergiy Kolodyazhnyy

Answers:


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)被分解为hm(第一和最后一个字段为空),并且(d+h:m)被分解为 dhm(再次,第一和最后一个字段为空)。
  2. 然后我们将倒数第二个字段花几分钟,倒数第三个字段花几个小时,倒数第四个字段花几天。如果没有日期,则倒数第四个字段将是第一个空字段。因此,0在这种情况下,我们将简单地添加。
  3. 然后,如果分钟和小时数分别超过60和24,我们就会增加小时数和天数。请注意,awk会进行浮点除法,因此h并且d现在可能具有小数部分。
  4. 然后,我们将数字打印为整数(%d),因此忽略任何小数部分。

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,\}\))/\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
  • 设置了一个参考假日期org = 2015-01-01,其中添加了当前正常运行时间。
  • 然后,将所有累积的正常运行时间添加到变量中 new
  • 两者之间的持续时间org与净正常运行时间之间new存在差异。

输出:

vayu@helix:$ ./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,\}\))/\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"

1
我以某种方式喜欢bash脚本,但是我知道这里可能有更优雅的答案。
ankit7540 '16

根据您的脚本,我去年在线花费了2258天,01小时,15分钟。
daltonfury42

错误已修复。代码压缩为8行。
ankit7540 '16

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))

3
“我相信有一种使用bash的优雅方法” IMHO Python是更好的选择。Bash适用于文件操作,不适用于计算。
Melebius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.