Shell Einzeiler Challange

Kamikaze

Warrior of Sunlight
Teammitglied
Mal abgesehen von kürzeren Variablennamen, bekommt jemand eine funktional gleichwertigen Einzeiler hin?

Code:
oldtimes=$(sysctl -n kern.cp_times); while sleep 1; do times=$(sysctl -n kern.cp_times); for time in $times; do printf "%8s" $(($time - ${oldtimes%% *})); oldtimes=${oldtimes#* }; done; echo; oldtimes=$times; done

Den Code kann man mit /bin/sh ausführen. Er listet im Sekundentakt die Veränderungen in den CPU-Zeit-Zählern (FreeBSD).

Das sieht dann etwa so aus:
Code:
$ oldtimes=$(sysctl -n kern.cp_times); while sleep 1; do times=$(sysctl -n kern.cp_times); for time in $times; do printf "%8s" $(($time - ${oldtimes%% *})); oldtimes=${oldtimes#* }; done; echo; oldtimes=$times; done
       2       0       1      80      51       2       0       1       0     131
       0       0       0      97      38      11       0       1       0     123
       0       0       1      92      42       6       0       1       0     127
       0       0       0      91      43       5       0       1       0     129
       1       0       1      83      50       6       0       1       0     128
       0       0       1      87      47       3       0       4       2     126
       0       0       0      90      45       4       0       2       1     128
       0       0       0      90      45       6       0       0       1     128
       1       0       0      88      46       3       0       2       0     130
       0       0       1      79      54       6       0       1       0     127
       0       0       2      76      57       7       0       1       0     127
       0       0       1      90      44       6       0       1       0     128
       1       0       0      85      49       8       0       0       0     127
       0       0       1      78      56       1       0       4       0     130
       2       0       2      88      43      12       0       6       0     117
       4       0       1      87      45      41       0       4       0      92
       1       0       0      92      42       6       0       5       0     124
       2       0       0      69      64      19       0       4       0     111
       3       0       0      68      64      11       0       1       0     123
 
Unter OpenBSD & ksh erfolgreich getestet (125 Zeichen):
Code:
t(){ sysctl -n kern.cp_time; };o=$(t);while sleep 1;do c=$(t);apply 'expr %1 - %2' $(echo $c,$o|rs -c, 2|rs -T)|rs;o=$c;done
Für FreeBSD müsste es hiermit klappen (122 Zeichen):
Code:
t(){ sysctl -n kern.cp_times; };o=$(t);while sleep 1;do c=$(t);apply 'expr %1 - %2' $(echo $c $o|rs 2|rs -T)|rs;o=$c;done
Man ahnt ja gar nicht was für Schätze in /usr/bin & Co. vergraben sind: Mit rs(1) kann man die zwei "Arrays" so umsortieren, dass die zusammengehörigen Werte nebeneinander stehen und diese dann mit apply(1) paarweise zu verrechnen.

Das 'echo $c $o|rs 2' dient allerdings nur als Kurzform von 'printf %s\n%s\n $c $o'. Im gleichen Sinne spart das '|rs' am Ende einige Zeichen gegenüber dem 'printf %8s ...; echo'.
 
Zuletzt bearbeitet:
Hey, danke! Für rs habe ich auch gleich Andernorts eine Verwendung gefunden.

Schöne Lösung.

TODO: apply und rs im Wiki in die Liste nützlicher Shell-Scripting Befehle aufnehmen.
 
Zurück
Oben