当前位置: 首页>>技术教程>>正文


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

, , ,

问题描述

我有兴趣了解 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)

现在我该如何添加它?

最佳回答

尝试使用 bash 脚本并扩展您的命令。\n我使用 dateutils 来累加持续时间。

因此,要使用此脚本,需要通过 apt 提供 dateutils 包。 (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"

次佳回答

这是我想要的 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))

第三种回答

这是 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) 格式,其中如果周期小于 1 天,则删除 days+

此处,第一个 awk 命令输出 reboot 条目的最后一列,即感兴趣的持续时间。

对于第二个 awk 命令:

  1. FS 是 [(+:)],即括号或 + 或 :。因此, (h:m) 被拆分为 、 h、m 和(第一个和最后一个字段为空),并且 (d+h:m) 被拆分为 、 d、h、m 和(同样,第一个和最后一个字段为空) 。

  2. 然后,我们采用 second-last 字段表示分钟,third-last 表示小时,fourth-last 表示天。如果 days 不存在,则 fourth-last 字段将是第一个空字段。因此,在这种情况下,我们将简单地添加 0

  3. 然后,如果分钟和小时分别高于 60 和 24,我们就会增加小时和天数。请注意,awk 进行浮点除法,因此 hd 现在可能有小数部分。

  4. 然后我们将数字打印为整数 ( %d ),因此任何小数部分都会被忽略。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14277.html,未经允许,请勿转载。