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
명령의 경우 :
FS
이다[(+:)]
, 즉, 괄호 또는+
나:
. 그래서,(h:m)
에 분할,
h
,m
과(첫 번째와 마지막 필드 비어 있음), 그리고
(d+h:m)
분열이다,
d
,h
,m
및(다시, 첫 번째와 마지막 필드가 비어).
- 그런 다음 두 번째 마지막 필드를 몇 분 동안, 세 번째 마지막 시간을 몇 시간 동안, 네 번째 마지막 필드를 며칠 동안 가져갑니다. 네 번째 마지막 필드는 일이없는 경우 비어있는 첫 번째 필드입니다.
0
이 경우 간단히 추가하겠습니다 . - 그런 다음 분과 시간이 각각 60과 24를 초과하면 시간과 일을 늘립니다. 그 AWK 그래서, 포인트 부문 부동 않습니다
h
및d
분수 부분을 이제있을 수 있습니다. - 그런 다음 숫자를 정수 (
%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))