इस साल मैंने अपने लैपटॉप पर कुल कितना समय बिताया?


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)

अब मैं इसे कैसे जोड़ूं?


क्या आप मुझे (१ + ०६: ४१) का अर्थ बता सकते हैं?
कशिश

@ आकाश १ दिन, ६ घंटे, ४१ मिनट
मूरू

बात यह है कि wtmpलॉग (जो आप lastकमांड के आउटपुट में देखते हैं) मासिक (इन /etc/logrotate.conf) को घुमाने के लिए सेट किए गए हैं , जिसका अर्थ है कि निश्चित समय अवधि के बाद, सबसे पुराना लॉग हटा दिया जाता है। दूसरे शब्दों में, आप जो कुछ भी करने की कोशिश कर रहे हैं last, वह सटीक नहीं होगा
सर्जियो कोलोडियाज़नी

@ Serg मैंने wtmp के लिए logrotate को निष्क्रिय कर दिया है। एक साल से अधिक समय हो चुका है जब मैंने ऐसा किया था, और वर्तमान में फ़ाइल का आकार 3.7M है। इसलिए मुझे कोई कारण नहीं दिखता कि इसे मासिक रूप से क्यों घुमाया जाए। ;)
डेल्टनफ्यूरी 42

@ daltonfury42 अगर यह अक्षम है तो यह घूमेगा नहीं। अधिकांश उपयोगकर्ता ऐसा नहीं करते हैं।
सर्गी कोलोडाज़हनी

जवाबों:


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) के रूप में प्रिंट करते हैं , इसलिए किसी भी आंशिक भाग को अनदेखा किया जाता है।

8

बैश स्क्रिप्ट के साथ कोशिश कर रहे हैं और अपनी कमांड बढ़ा रहे हैं। मैं 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
किसी तरह मुझे बैश स्क्रिप्ट पसंद है, लेकिन मैं यहां जानता हूं कि अधिक सुरुचिपूर्ण उत्तर संभव हैं।
अंकित an५४०

आपकी पटकथा के अनुसार, मैं पिछले साल 2258 दिन, 01 घंटे, 15 मिनट ऑनलाइन बिताता हूं।
daltonfury42

त्रुटि ठीक की गई। कोड 8 लाइनों के लिए संकुचित।
अंकित

5

यहाँ मैं क्या चाहता हूँ का एक अजगर कार्यान्वयन है, लेकिन मुझे यकीन है कि इसे बैश के साथ करने का एक सुंदर तरीका है:

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
"मुझे यकीन है कि बैश के साथ ऐसा करने का एक सुंदर तरीका है" IMHO पायथन एक बेहतर विकल्प है। बैश फ़ाइल जोड़तोड़ के लिए अच्छा है, न कि गणना के लिए।
मेलेबियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.