今年のラップトップで費やした合計時間を見つける方法は?


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)の意味を教えてもらえますか?
カシッシュ16

@kashish 1日、6時間、41分
muru

問題は、wtmpログ(lastコマンドの出力に表示される)が毎月(in /etc/logrotate.conf)にローテーションするように設定されていることです。つまり、特定の期間が経過すると、最も古いログが削除されます。あなたがやろうとしているものは何でも言い換えれば、lastそれは正確では文句を言わない
Sergiy Kolodyazhnyy

@Serg wtmpのlogrotateを無効にしました。私がそれをしてから1年以上が経ち、現在ファイルサイズは3.7Mです。したがって、毎月ローテーションする必要がある理由はわかりません。;)
daltonfury42 16

@ daltonfury42無効にすると、回転しません。ほとんどのユーザーはそれをしません。
セルギーKolodyazhnyy 16

回答:


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エントリの最後の列、対象期間を出力します。

2番目のawkコマンドの場合:

  1. FS[(+:)]、つまり、括弧または + または :です。だから、(h:m)に分割されhmそして(最初と最後のフィールドは空)、および(d+h:m)に分割され dhm及び(再び、最初と最後のフィールドは空を)。
  2. 次に、最後から2番目のフィールドを数分間、最後から3番目を数時間、最後から4番目を日数とします。日が存在しない場合、最後から4番目のフィールドは最初の空のフィールドになります。したがって、0この場合は単純に追加します。
  3. 次に、分と時間がそれぞれ60と24を超える場合、時間と日を増やします。awkは浮動小数点除算を行うためhd小数部分がある場合があることに注意してください。
  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"
  • 最初に、最後のリブートからのアップタイムがリストされ、フォーマットされて、日、時間、分、および2番目の情報が抽出されます。その後、これはに保存されtempます。
  • org =と呼ばれる参照の偽の日付が設定され2015-01-01、現在の稼働時間が追加されます。
  • その後、すべての累積稼働時間が変数に追加されます new
  • orgと正味の稼働時間の間の期間は、new差によって検出されます。

出力:

vayu@helix:$ ./uptime_record.sh
Total run time (days:hours:minutes)
57d 20h 36m

次のスクリプトは、スクリプトが実行された日からちょうど1年後の稼働時間用です。

#!/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は、計算ではなくファイル操作に適しています。
メレビウス16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.