2013-06-23 9 views
20

time ls का उपयोग करना, मैं निम्नलिखित उत्पादन:Grep समय आदेश उत्पादन

$ 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 

अब, जब मैं grep को केवल असली मूल्य लाइन की कोशिश, वास्तविक परिणाम है:

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

मेरा सवाल है, आउटपुट के रूप में केवल वास्तविक मूल्य कैसे प्राप्त करें? इस मामले में, 0m0.040s

+2

'टाइम' अपने आउटपुट को stderr पर भेज रहा है, stdout नहीं, इसलिए 'grep' इसके आउटपुट के * किसी भी * को संसाधित नहीं कर रहा है। – Gabe

उत्तर

39

time अपने आउटपुट को stderr लिखता है, इसलिए आपको stdout के बजाय पाइप stderr की आवश्यकता है। लेकिन यह भी याद रखना महत्वपूर्ण है कि time बैश के सिंटैक्स का हिस्सा है, और यह एक पूरी पाइपलाइन के समय होता है। परिणामस्वरूप, आप ब्रेसिज़ में पाइप लाइन लपेटो, या एक subshell में इसे चलाने के लिए की जरूरत है:

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

बैश v4.0 (शायद लिनक्स वितरण पर सार्वभौमिक लेकिन अभी भी मैक ओएस एक्स पर मानक नहीं) के साथ, आप |& उपयोग कर सकते हैं पाइप दोनों stdout और stderr रहे हैं:

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

वैकल्पिक रूप से, आप time उपयोगिता है, जो उत्पादन प्रारूप के नियंत्रण की अनुमति देता है उपयोग कर सकते हैं। time उपयोगिता के बारे में अधिक जानकारी के लिए

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

man time: अपने सिस्टम पर, कि उपयोगिता /usr/bin/time में पाया जाता है।

+0

आपको धन्यवाद धन्यवाद ..... यह ठीक काम कर रहा है। – jettisamba

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

यह stderr पुनर्निर्देश (जो वह जगह है जहाँ समय इसके उत्पादन भेजता है) stdout रूप में एक ही धारा है, तो stdout पुनर्निर्देश/बातिल देव को तो ls के उत्पादन पर कब्जा कर लिया है, तो पाइप क्या अब के उत्पादन में है grep के stdin में समय।

+6

पूरा होने के लिए, आपको '| अजीब '{प्रिंट $ 2}' 'अंत तक, क्योंकि ओपी को केवल समय का भाग चाहिए। –

+1

@ बुरहान खालिद वास्तव में - लेकिन हमें ओपी के लिए _something_ छोड़ना चाहिए :-) – Clyde

+0

धन्यवाद क्लाइड ........ – jettisamba

8

तुम सिर्फ timebuiltin के उत्पादन में प्रारूप निर्दिष्ट करना चाहते हैं, तो आप TIMEFORMAT वातावरण चर के मूल्य के बजाय grep के साथ छानने का संशोधित कर सकते हैं।

तुम मामले में,

TIMEFORMAT=%R 
time ls -l 

तुम 'असली' समय केवल देना होगा।

Here's the link बैश मैनुअल में प्रासंगिक जानकारी के लिए ("TIMEFORMAT" के अंतर्गत)।

Thistime के आउटपुट को पार्स करने के बारे में SO पर एक समान प्रश्न है।

+0

आपको धन्यवाद डूबाउन .... – jettisamba

+0

इस तरह से बेहतर आउटपुट भी। सेराफिना @ बॉक्स: ~ $ TIMEFORMAT =% R && समय ls>/dev/null 0.001 –

0

मुझे लगता है, यह थोड़ा आसान बनाया जा सकता है:

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

बाहर देखो .. बैश निर्मित एक "समय" कमांड है। यहां कुछ अंतर हैं ..

# 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