2010-12-16 4 views

Antwort

0

in String gebaut bash Mit Globbing Sie so etwas tun könnte:

output="real 0m0.002s 
user 0m0.001s 
sys 0m0.000s" 

#get everything to the right of first "*user " 
user=${output#*user } 
#get everything to the left of the first "s*" 
user=${user%%s*} 
#get everythig to let left of "m*" 
min=${user%%m*} 
#get everything to the right of "*m" and left of ".*" 
sec=${user#*m} 
sec=${sec%%.*} 
#get everything to the right of "*." 
usec=${user#*.} 


time=$[$usec + $sec * 1000 + $min * 60000] 

Ergebnisse laufen bash -x

+ output='real 0m0.002s 
user 0m0.001s 
sys 0m0.000s' 
+ user='0m0.001s 
sys 0m0.000s' 
+ user=0m0.001 
+ min=0 
+ sec=0.001 
+ sec=0 
+ usec=001 
+ time=1 
10

Die saubere Art und Weise ist es, die TIMEFORMAT Shell-Variable zu verwenden, nur die Benutzerinformationen drucken . (man bash für weitere Details.)

Dann natürlich müssen Sie die Ausgabe von ihm erfassen. Dies ist aus der Pipeline nicht möglich, da es intern von der Shell ausgeführt wird. Sie können es jedoch in einer Subshell ausführen, und die Ausgabe wird auf den Standardfehler gesetzt. Aber dann müssen Sie die Ausgabe des Befehls irgendwie anderswo umleiten. Hier verwerfe ich es einfach, aber viele andere Möglichkeiten existieren, abhängig davon, was genau Sie tun müssen. Dann müssen Sie d.ddd in dddd munge. Löschen Sie einfach den Zeitraum wird dies tun.

(TIMEFORMAT="%U"; time ls > /dev/null) |& tr -d . 

Wenn Sie möchten, können Sie | sed s/^0*// fügen Sie die führenden Nullen zu beseitigen.

% R gibt Echtzeit,% S Systemzeit. Sie können die Genauigkeit z. % 6U, um Mikrosekunden zu erhalten, obwohl die meisten Systeme nicht annähernd genau sind.

man bash für Hilfe bei Weiterleitungen. man tr und man sed für Hilfe, wie man sie benutzt.

+0

Anstatt Rohrleitungen zu 'tr' gewünscht, sobald Sie' foo = „0.00X“ haben 'Sie verwenden konnte diese Parameter Erweiterung und Ausgabe '$ {foo # *.}', Um nur '00X' zu bekommen. Wie auch immer, guten Ruf auf die Variable TIMEFORMAT, noch nie zuvor gesehen. – SiegeX

+0

Mann, mein Unix Flash-Licht-Fu ist nie hell genug.Es gibt immer eine erstaunlich einfache und sehr spezifische Art, in einer dunklen Ecke der Dokumentation etwas Cooles zu tun. +1 für 'TIMEFORMAT' - viel besser als das (wenn auch einfache) sed-Skript, das ich machen würde. – Jamie

9

Bash time builtin ist ein bisschen schwierig zu erfassen, weil sie eine besondere Behandlung hat, so dass sie die Bearbeitungszeit für eine ganze Pipeline wie time ls -l | sort | uniq und nicht nur die Bearbeitungszeit für nur den ls -l Befehl in meinem Beispiel zurückkehren kann.

Der beste Weg, nur die Ausgabe von Zeit zu erfassen ist die folgende Umleitungstechnik:

exec 3>&1 4>&2 
foo=$({ time some_command 1>&3 2>&4; } 2>&1) # change some_command 
exec 3>&- 4>&- 

An diesem Punkt, wenn Sie echo "$foo" sind Sie würden etwas in der Größenordnung von

real 0m0.013s 
user 0m0.004s 
sys  0m0.007s 
sehen

Nun, um nur den 004 Teil davon zu bekommen, haben Sie ziemlich viele Optionen: sed, awk oder straight bash, um die Top 3 zu nennen. Mein persönlicher Favorit wäre awk und würde irgendwie aussehen Hing wie folgt aus:

foo=$({ time some_command 1>&3 2>&4;} 2>&1 | awk -F'[s.]' '/user/{print $3}') 

Jetzt würde, wenn Sie echo "$foo" waren Sie sehen gerade 004 als

Verwandte Themen