2013-06-23 27 views
20

Korzystanie time ls, mam następujący wynik:czas Grep wyjściowe polecenia

$ time ls -l 
total 2 
-rwx------+ 1 FRIENDS None 97 Jun 23 08:59 location.txt 
-rw-r--r--+ 1 FRIENDS None 10 Jun 23 09:06 welcome 
real 0m0.040s 
user 0m0.000s  
sys  0m0.031s 

Teraz, gdy próbuję grep jedyną prawdziwą linię wartość rzeczywisty wynik jest:

$ time ls -l | grep real 
real 0m0.040s 
user 0m0.000s 
sys  0m0.031s 

Moje pytanie brzmi: jak uzyskać tylko rzeczywistą wartość jako wynik? W tym przypadku, 0m0.040s.

+2

'oddać porównywalnych towarów wysyła swoje wyjście na stderr, nie stdout, więc' grep' nie przetwarza żadnych * * jego wyjściu. – Gabe

Odpowiedz

39

time zapisuje dane wyjściowe do stderr, więc musisz wyprowadzać stderr zamiast standardowe wyjście. Ale ważne jest również, aby pamiętać, że time jest częścią składni bashu, a czas cały rurociąg. W związku z tym, należy owinąć rurociągu w szelki, lub uruchomić go w podpowłoce:

$ { time ls -l >/dev/null; } 2>&1 | grep real 
real 0m0.005s 

Z bash v4.0 (prawdopodobnie na uniwersalnej dystrybucji Linuksa, ale wciąż nie na standardowym systemie Mac OS X), można użyć |& do rury zarówno stdout i stderr:

{ time ls -l >/dev/null; } |& grep real 

Alternatywnie, można użyć narzędzia time, która umożliwia kontrolę nad formatem wyjściowym. W moim systemie, że narzędzie znajduje się w /usr/bin/time:

/usr/bin/time -f%e ls -l >/dev/null 

man time więcej szczegółów na temat użyteczności time.

+0

dziękuję rici ..... działa dobrze. – jettisamba

11
(time ls -l) 2>&1 > /dev/null |grep real 

ten przekierowuje stderr (czyli tam, gdzie czas wysyła swoje wyjście) do tego samego strumienia jako standardowe wyjście, a następnie przekierowuje stdout do dev/null więc wyjście z ls nie jest zrobione, a następnie rury, co jest teraz wyjście czas na stdin grep.

+6

Aby być kompletnym, powinieneś dodać '| awk '{print $ 2}' 'do końca, ponieważ OP wymaga tylko części czasu. –

+1

@BurhanKhalid Rzeczywiście tak - ale powinniśmy zostawić Coś dla OP do zrobienia :-) – Clyde

+0

dziękuję Clyde ........ – jettisamba

8

Jeśli tylko chcesz określić format wyjściowy timewbudowanym, można zmienić wartość zmiennej środowiskowej TIMEFORMAT zamiast filtrując ją grep.

w tobie przypadku

TIMEFORMAT=%R 
time ls -l 

nie daje "prawdziwy" tylko raz.

Here's the link do odpowiednich informacji w instrukcji Bash (w "TIMEFORMAT").

This to jest podobne pytanie na SO o parsowanie wyjścia time.

+0

dziękuję doubieDown .... – jettisamba

+0

Jeszcze lepsze wyjście w ten sposób. serafina @ box: ~ $ TIMEFORMAT =% R && time ls>/dev/null 0,001 –

0

myślę, że może to być trochę łatwiej:

time ls &> /dev/null | grep real 
0

Uważaj .. bash ma komendę „czas” wbudowany. Oto niektóre z różnic ..

# GNU time command (can also use $TIMEFORMAT variable instead of -f) 
bash> /usr/bin/time -f%e ls >/dev/null 
0.00 


# BASH built-in time command (can also use $TIME variable instead of -f) 
bash> time -f%e ls >/dev/null 
-f%e: command not found 

real 0m0.005s 
user 0m0.004s 
sys  0m0.000s 
Powiązane problemy