Rekenen met tijd in BASH....

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • NvBgm
  • Registratie: Maart 2003
  • Laatst online: 08-03-2024
Hallo ik zit met een volgend probleempje in BASH

Ik lees uit een apparaat de runtime en wil dit omrekenen naar uren minuten en seconden.
De afgeronde uren lukt mij tot nu toe maar geen minuten en seconden.

De waarden die ik uit de twee registers lees is: R1=611 en R2=12533

R2 word elke minuut verhoogd met 120 (halve seconden dus)
R1 word met 1 verhoogd als R2 de waarde van 65536 heeft bereikt
R2 begint dan weer op nul.

Om nu de uren te berekenen heb ik het volgende gedaan.

(( Uren = ($R1 * 65536 + $R2) / 7200 )) # Uren

Maar ik wil ook de minuten en seconden uitrekenen.

Is dit mogelijk in BASH ???

Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 15-07 16:50

Kees

Serveradmin / BOFH / DoC
Ja dat is mogelijk; zie http://tldp.org/LDP/abs/html/ops.html wat je zoekt is de modulo operator

En dan krijg je iets als dit:

runtime = ($R1 * 65536 + $R2) / 2
uren = $runtime / 3600
minuten = ($runtime % 3600) / 60
seconden = ($runtime % (3600*60)) / 60

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • NvBgm
  • Registratie: Maart 2003
  • Laatst online: 08-03-2024
Hallo Kees,

Ja daar kom ik een eind verder mee maar de laatste geeft hier niet de juiste waarde.

Als R1=0 en R2=65536 zou de uitkomst moeten zijn

9 uur 6 min en 8 sec

Ik krijg nu

9 uur 6 min en 546 seconden

Acties:
  • 0 Henk 'm!

  • NvBgm
  • Registratie: Maart 2003
  • Laatst online: 08-03-2024
Als voorbeeld.

#!/bin/bash
#
#==========================================================
#
HtotH=0
HtotL=65536

(( runtime = ($HtotH * 65536 + $HtotL) / 2 ))
(( uren = $runtime / 3600 ))
(( minuten = ($runtime % 3600) / 60 ))
(( seconden = ($runtime % (3600*60)) / 60 ))

echo $runtime #32768
echo $uren #9
echo $minuten #6
echo $seconden #546

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Bash:
1
2
(( seconden = ($R1 * 65536 + $R2) / 2 )) 
TZ=UTC date -d $seconden -D '%s' +'%H:%M:%S'

Acties:
  • 0 Henk 'm!

  • NvBgm
  • Registratie: Maart 2003
  • Laatst online: 08-03-2024
Mijzelf schreef op woensdag 29 oktober 2014 @ 12:20:
Bash:
1
2
(( seconden = ($R1 * 65536 + $R2) / 2 )) 
TZ=UTC date -d $seconden -D '%s' +'%H:%M:%S'
-D word niet herkend ?

Deze heeft echt wat meer uitleg nodig voor mij ..

[ Voor 9% gewijzigd door NvBgm op 29-10-2014 12:48 ]


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 22:20

Hero of Time

Moderator LNX

There is only one Legend

Dit is wat ik gebruik om m'n uptime weer te geven in m'n $PS1:
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
upSeconds=`cat /proc/uptime`;
upSeconds=${upSeconds%%.*};
let secs=$((${upSeconds}%60))
let mins=$((${upSeconds}/60%60))
let hours=$((${upSeconds}/3600%24))
let days=$((${upSeconds}/86400))
if [ "${days}" -ne "0" ]
    then
        echo -n "${days}d "
fi
echo -n "${hours}h ${mins}m"

Eventueel zelf nog ombouwen naar wat jij nodig hebt, want secs is niet %60 voor jou, maar %120 (ivm je halve seconden).

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • NvBgm
  • Registratie: Maart 2003
  • Laatst online: 08-03-2024
Haha ja de naam zegt het al Hero of Time.
Maar dit was wat ik nodig had kom er nu wel met wat breek en sloopwerk..

Bedankt allemaal..

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
NvBgm schreef op woensdag 29 oktober 2014 @ 12:44:
[...]


-D word niet herkend ?

Deze heeft echt wat meer uitleg nodig voor mij ..
Dan heb jij een andere versie van 'date' dan ik. Mogelijk werkt
Bash:
1
TZ=UTC date -d @${seconden} +'%H:%M:%S'
dan.

Wat hier gebeurt is dat 'date' de opdracht krijgt om de tijd te laten zien in het opgegeven formaat, alleen niet 'now', maar de tijd die achter -d is gespecificeerd.
Dat is de tijd in seconden sinds 1970, maar aangezien we alleen naar uren/minuten/seconden kijken, doet dat er niet toe.
Om een offset te voorkomen wordt nog even de UTC tijdzone gespecificeerd.

@Hero of time:
In een one-liner
Bash:
1
 TZ=UTC date -d @"$( cat /proc/uptime | cut -d ' ' -f 1 )" +'%jd %Hh %Mm'

[ Voor 8% gewijzigd door Mijzelf op 29-10-2014 13:32 ]


Acties:
  • 0 Henk 'm!

  • NvBgm
  • Registratie: Maart 2003
  • Laatst online: 08-03-2024
Hero of Time schreef op woensdag 29 oktober 2014 @ 12:52:
Dit is wat ik gebruik om m'n uptime weer te geven in m'n $PS1:
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
upSeconds=`cat /proc/uptime`;
upSeconds=${upSeconds%%.*};
let secs=$((${upSeconds}%60))
let mins=$((${upSeconds}/60%60))
let hours=$((${upSeconds}/3600%24))
let days=$((${upSeconds}/86400))
if [ "${days}" -ne "0" ]
    then
        echo -n "${days}d "
fi
echo -n "${hours}h ${mins}m"

Eventueel zelf nog ombouwen naar wat jij nodig hebt, want secs is niet %60 voor jou, maar %120 (ivm je halve seconden).
Ik heb het volgende gedaan wat de 60 en de 120 seconden betreft.

(( runtime = ($HtotH * 65536 + $HtotL) /2 ))
runtime=${runtime%%.*};

Is dit trouwens ook in 1 commando te vatten ???

Resultaat is hier te zien www.nvbgm.nl

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
NvBgm schreef op woensdag 29 oktober 2014 @ 13:39:
[...]

Is dit trouwens ook in 1 commando te vatten ???
Volgens mij kun je de tweede regel gewoon weglaten. Ik denk dat HoT die toevoegde omdat /proc/uptime twee getallen bevat, waarvan alleen de eerste moet worden gebruikt.
Ik kan het niet decoderen, maar ik neem aan dat die regel op de een of andere manier element 0 van een array pakt.

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 22:20

Hero of Time

Moderator LNX

There is only one Legend

Mijzelf schreef op woensdag 29 oktober 2014 @ 13:23:
@Hero of time:
In een one-liner
Bash:
1
 TZ=UTC date -d @"$( cat /proc/uptime | cut -d ' ' -f 1 )" +'%jd %Hh %Mm'
Dan krijg ik een lelijk resultaat, namelijk '002d 23h 23m', ipv '1d 23h 23m', of als 't 0 dagen is, zonder het aantal dagen.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • FitzJac
  • Registratie: November 2010
  • Laatst online: 15-07 17:02
Laat maar, klopt niet als je niet minimaal in dag up bent.

[ Voor 254% gewijzigd door FitzJac op 29-10-2014 15:20 ]


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 15-07 16:50

Kees

Serveradmin / BOFH / DoC
NvBgm schreef op woensdag 29 oktober 2014 @ 11:51:
Hallo Kees,

Ja daar kom ik een eind verder mee maar de laatste geeft hier niet de juiste waarde.
Iets te snel getyped, het moet %60 zijn en niet %(3600*60). Had het zelf niet uitgeprobeert. Maar als je zelf een beetje weet hoe tijd in elkaar zit had je dat ook wel kunnen bedenken ;)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • NvBgm
  • Registratie: Maart 2003
  • Laatst online: 08-03-2024
Kees schreef op woensdag 29 oktober 2014 @ 18:28:
[...]

Iets te snel getyped, het moet %60 zijn en niet %(3600*60). Had het zelf niet uitgeprobeert. Maar als je zelf een beetje weet hoe tijd in elkaar zit had je dat ook wel kunnen bedenken ;)
Nou ben ik niet zo goed in tijd en berekenen Kees vandaar dat ik het hier ook vraag maar als ik %(3600*60) vervang door %60 dan kom ik nog niet op de juiste seconden uit volgens mij..

Ook het /60 moet er nog vanaf.....

(( seconden = ($runtime % 60)))

[ Voor 6% gewijzigd door NvBgm op 29-10-2014 18:54 ]


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 22:20

Hero of Time

Moderator LNX

There is only one Legend

Je tijd is toch in halve seconden? Waarom dan %60 en /60 op je waarde, terwijl je 'm nog nergens /2 doet?

Even zelf wat gedaan en kom uit op 't volgende, vreemd genoeg wil 'let' niet werken, dus zonder gedaan:
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# Volgende zou 't moeten doen, maar weet ik niet zeker.
# Test het dus!
tijd=$(((${R1} * 65536 + ${R2}) / 2))
echo $tijd

#tijd='65536' #dit was mijn eigen test
#echo $tijd

tijd=$((${tijd}/2))
echo $tijd

secs=$((${tijd}%60))
mins=$((${tijd}/60%60))
hours=$((${tijd}/3600%24))
days=$((${tijd}/86400))

echo secs $secs
echo mins $mins
echo hour $hours
echo days $days

Was dat nou heel moeilijk? Je maakt van 't totaal 1 waarde en gooit die hier doorheen.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • NvBgm
  • Registratie: Maart 2003
  • Laatst online: 08-03-2024
Dat werkt hier prima alleen zit ik nog met 1 ding.
Mijn tijd word aangegeven als uren:min:sec
Wanneer er nu 4 minuten en 2 seconden word aangegeven ziet het er als vvolgt uit:

5:4:2

Hoe krijg ik nu het volgende:

05:04:02 en waneer het 14minuten en 15 seconden is dat het dan 05:14:15 blijft..


(( diff=$(date +"%s") - ${store[7]} ))
Htoday="$(($diff / 3600)):$((($diff % 3600) / 60))"

Geeft nu 5:4
Wil graag 5:04

[ Voor 9% gewijzigd door NvBgm op 29-10-2014 23:18 ]


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 22:20

Hero of Time

Moderator LNX

There is only one Legend

We verwachten hier op GoT toch enige inzet en eigen vermogen om te werken met de tips en hulpmiddelen die zijn gegeven. Als je datum wilt sorteren op YY-MM-DD en je krijgt DD-MM-YY aangeboden, wat doe je dan? Laat het dan ook door een ander voorkauwen, of kom je zelf met een oplossing?

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 15-07 16:50

Kees

Serveradmin / BOFH / DoC
Hero of Time schreef op woensdag 29 oktober 2014 @ 20:35:
Je tijd is toch in halve seconden? Waarom dan %60 en /60 op je waarde, terwijl je 'm nog nergens /2 doet?
In mijn post deed ik al meteen /2 ;)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024

Rainmaker

RHCDS

Je hebt er niets aan, omdat je het perse in bash wou doen. Maar zo kan het ook:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python3

r1 = 611
r2 = 12533

#Seconden berekenen
secs = ((r1 * 65536) + r2) // 2  #Vervang door 1 slash om ook halve seconden weer te geven
print('Seconden uptime: {}'.format(secs))

uren, secsrem =  secs // 3600, secs % 3600
minuten, secsrem2 = secsrem // 60, secsrem % 60

print('{:0>1n}:{:0>2n}:{:0>2n}'.format(uren, minuten, secsrem2))


Dit om 2 redenen;
- Ter lering en vermaak van mezelf (met name deze)
- Om aan te geven dat bash scripting niet altijd de netste code oplevert.

We are pentium of borg. Division is futile. You will be approximated.

Pagina: 1