올해 랩톱에서 보낸 총 시간을 찾는 방법은 무엇입니까? –since 2016-01-01 –until 2016-12-31 | grep -o

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)

이제 어떻게 추가합니까?



답변

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 그래서, 포인트 부문 부동 않습니다 hd분수 부분을 이제있을 수 있습니다.
  4. 그런 다음 숫자를 정수 ( %d) 로 인쇄 하므로 소수 부분은 무시됩니다.

답변

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.
  • 참조 가짜 날짜는 2015-01-01현재 가동 시간이 추가되는 org =라고 설정 됩니다.
  • 그런 다음 모든 누적 가동 시간이 변수에 추가됩니다. 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"

답변

다음은 내가 원하는 것을 파이썬으로 구현 한 것이지만 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))