2009-12-25 13 views
33

पर असाइन करना मैं एक अजीब स्क्रिप्ट में system कमांड चलाने के लिए और एक चर में संग्रहीत आउटपुट प्राप्त करना चाहता हूं। मैं ऐसा करने की कोशिश कर रहा हूं, लेकिन कमांड का आउटपुट हमेशा खोल में जाता है और मैं इसे कैप्चर करने में सक्षम नहीं हूं। यह कैसे किया जा सकता है पर कोई विचार?सिस्टम कमांड के आउटपुट को वैरिएबल

उदाहरण:

$ date | awk --field-separator=! {$1 = system("strip $1"); /*more processing*/} 

strip प्रणाली आदेश बुलाना चाहिए और इसके बजाय खोल करने के लिए उत्पादन को भेजने की है, और अधिक प्रसंस्करण के लिए उत्पादन वापस $1 को आवंटित करने चाहिए। अब साइन इन करें, यह खोल को आउटपुट भेज रहा है और कमांड के रीकोड को $1 पर असाइन कर रहा है।

+1

निट: उत्पादन खोल नहीं जा रहा है, यह टर्मिनल के लिए जा रहा है/कंसोल। खोल अपने बच्चों के किसी भी आउटपुट को नहीं पढ़ता है - वे सिर्फ उसी फ़ाइल के साथ जुड़े फाइल डिस्क्रिप्टर साझा करते हैं। –

उत्तर

23

पता लगाया गया।

हम का उपयोग awk के Two-way I/O

{ 
    "strip $1" |& getline $1 
} 

$ 1 गुजरता पट्टी और getline $ 1

+1

यदि आपको कई बार एक ही कमांड को कॉल करने की आवश्यकता है, तो हमें कमांड को बंद करना होगा (http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_26.html#SEC29) – mcoolive

49

नोट वापस करने के लिए पट्टी से उत्पादन लेता है: Coprocess जीएनयू AWK विशिष्ट है। वैसे भी एक और विकल्प getline

cmd = "strip "$1 
while ((cmd | getline result) > 0) { 
    print result 
} 
close(cmd) 
+0

धन्यवाद। इस तरह, मैं अपने उत्तर से और हटा सकता हूं। कूलर लग रहा है। लेकिन मैं केवल लिनक्स में उपयोग के लिए लिख रहा हूं, इसलिए गॉक की अनुपलब्धता कोई मुद्दा नहीं होना चाहिए? – Sahas

+0

हां, कोई मुद्दा नहीं होना चाहिए। अभी भी आपको दस्तावेज़ीकरण की जांच करनी चाहिए और देखें कि क्या कॉक्रोस केवल गॉक के कुछ संस्करण में उपलब्ध है। मैं संस्करण 3.1 से अपने सिर – ghostdog74

+0

के शीर्ष पर याद नहीं कर सकता। रेडहाट में 3.1.5 है। वैसे भी मैं आपके द्वारा सुझाए गए तरीके का उपयोग करूंगा, जब तक कि मैं कमांड के stdin को कुछ नहीं भेजना चाहता, जिस स्थिति में कॉप्रोसेस सहायक होता है। – Sahas

5
gawk '{dt=substr($4,2,11); gsub(/\//," ",dt); "date -d \""dt"\" +%s"|getline ts; print ts}' 
+13

यदि आप उत्तर पोस्ट करते हैं तो आपको विभिन्न हिस्सों को समझा जाना चाहिए (आपने क्या किया और यह क्यों काम करता है)। ताकि अन्य आपके उत्तर से सीख सकें। कुछ लोगों के लिए यह लाइन स्वयं समझाएगी। लेकिन दूसरों के लिए यह ठीक करना है कि आपने वास्तव में क्या किया है। –

16

उपयोग कर रहा है awk में एक प्रणाली आदेश आप system() या cmd | getline उपयोग कर सकते हैं चलाने के लिए।

मैं cmd | getline पसंद करते हैं क्योंकि यह आपको एक चर में मूल्य को पकड़ने के लिए अनुमति देता है: आम तौर पर

$ awk 'BEGIN {"date" | getline mydate; close("date"); print "returns", mydate}' 
returns Thu Jul 28 10:16:55 CEST 2016 

, आप एक चर में आदेश सेट कर सकते हैं:

awk 'BEGIN { 
     cmd = "date -j -f %s" 
     cmd | getline mydate 
     close(cmd) 
    }' 

नोट यह महत्वपूर्ण है यदि आपके पास एकाधिक परिणाम हैं (टिप्पणियों में इसे इंगित करने के लिए धन्यवाद mateuscb) "बहुत अधिक खुली फाइलें" त्रुटि प्राप्त करने से रोकने के लिए close() का उपयोग करें।


system() का उपयोग करना, आदेश उत्पादन स्वचालित रूप से छपा है और मूल्य आप पकड़ कर सकते हैं अपनी वापसी कोड है:

$ awk 'BEGIN {d=system("date"); print "returns", d}' 
Thu Jul 28 10:16:12 CEST 2016 
returns 0 
$ awk 'BEGIN {d=system("ls -l asdfasdfasd"); print "returns", d}' 
ls: cannot access asdfasdfasd: No such file or directory 
returns 2 
+2

+1 'क्लोज़()' जोड़ने के लिए +1, यदि आप इसे नहीं जोड़ते हैं, और आपके पास कई परिणाम हैं, तो आपको "बहुत सारी खुली फाइलें मिल सकती हैं"। यदि आपके पास लंबा आदेश है, तो आप 'cmd =" ​​date -j -f% s "कर सकते हैं; cmd | गेटलाइन माईडेट; बंद करें (cmd) ' – mateuscb

+1

@mateuscb आपकी प्रतिक्रिया के लिए बहुत धन्यवाद। मैंने आपकी उपयोगी टिप्पणियों को शामिल करने के लिए प्रश्न अपडेट किया। – fedorqui

+1

नज़दीक() कमांड की याद दिलाने के लिए धन्यवाद। यह बहुत मदद करता है। नज़दीक() को छोड़कर, मुझे कभी-कभी कई परिणामों के लिए गलत दिनांक परिणाम मिलता है। बंद करने के साथ()। मेरे एकाधिक दिनांक परिणाम सभी सही ढंग से प्रदर्शित होते हैं। – csu007

संबंधित मुद्दे