2013-12-17 5 views
36

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

इस फ़ाइल की प्रत्येक पंक्ति एक फ़ाइल का पता है, और मैं उस फ़ाइल को संसाधित करने के लिए एक आदेश चलाने के लिए चाहता हूं। तो, एक साधारण उदाहरण के लिए मैं प्रत्येक लाइन के लिए 'wc' कमांड का उपयोग करना चाहता हूं और $1 को wc पर पास करना चाहता हूं।

awk '{system("wc $1")}' myfile 
+0

पहले एसओ में खोजें, पहले से ही सौ समाधान हैं। – BMW

+2

आपको लगता है कि इस नौकरी के लिए अजीब सही उपकरण क्यों है? ऐसा लगता है कि 'xargs' या एक साधारण खोल' है, जबकि रीड लाइन 'लूप बेहतर और आसान होगा। –

+1

फ्लिप पक्ष पर: आपको लगता है कि इस नौकरी के लिए डब्ल्यूसी सही उपकरण क्यों है? ऐसा लगता है कि अजीब बिल्टिन वैरिएबल और फ़ंक्शन बेहतर और आसान होंगे? –

उत्तर

49

आप करीब हैं। आप awk चर के साथ कमांड लाइन जोड़ करने के लिए है:

awk '{system("wc "$1)}' myfile 
+0

धन्यवाद, यह काम करता है! लेकिन एक और सवाल? क्या हम आउटपुट को एक नए चर में आवंटित कर सकते हैं? –

+0

हाँ हम कर सकते हैं। '{newVar = system (...)}' @VahidMir – Kent

+5

यह नौकरी के लिए गलत वाक्यविन्यास है, यह सिस्टम() के लिए गलत एप्लीकेशन है, प्रिंट ऐसा नहीं करता जो आपको लगता है कि यह करेगा, और नहीं, आप नहीं कर सकते किसी सिस्टम के आउटपुट को असाइन करें() एक अजीब वैरिएबल पर कॉल करें, जो आपने अपनी टिप्पणी में पोस्ट किया है वह सिस्टम() से एक वैरिएबल में रिटर्न कोड असाइन करता है। कुछ कॉफी @ केंट के लिए समय! –

34

आप एक awk system() कॉल के उत्पादन में आकर्षित नहीं कर सकते हैं, आप केवल बाहर निकलने का दर्जा मिल सकता है। getline/pipe या getline/variable/pipe निर्माणों का प्रयोग करें

awk '{ 
    cmd = "your_command " $1 
    while (cmd | getline line) { 
     do_something_with(line) 
    } 
    close(cmd) 
}' file 
+3

+1, लेकिन सामान्य रूप से चर बनाने के लिए वाक्यविन्यास 'cmd = "your_command \" "$ 1" "\" है, इसलिए जब सीएमडी निष्पादित किया जाता है तो तर्क उद्धृत किया जाता है और आपको शून्य से अधिक होने वाली गेटलाइन के परिणाम के लिए परीक्षण करने की आवश्यकता है या यदि असफल हो तो आप एक अनंत लूप में फंस जाएंगे। –

+1

+1। ओपी, अगर आपको एक var में आउटपुट स्टोर करने की आवश्यकता है, तो भी इस जवाब को स्वीकार करें। मेरा वर्क असाइनमेंट के लिए सही नहीं था। – Kent

2

FYI करें यहाँ कैसे फ़ाइलें हैं जिनके नाम एक फ़ाइल में जमा हो जाती है (इस उदाहरण में WC-तरह कार्यक्षमता प्रदान) को संसाधित करने awk उपयोग करने के लिए है:

gawk ' 
NR==FNR { ARGV[ARGC++]=$0; next } 
{ nW+=NF; nC+=(length($0) + 1) } 
ENDFILE { print FILENAME, FNR, nW, nC; nW=nC=0 } 
' file 

ऊपर का उपयोग करता है ENDFILE के लिए जीएनयू अजीब। अन्य awks के साथ सिर्फ एक सरणी में मानों को स्टोर करें और END अनुभाग में एक लूप में प्रिंट करें।

0

या, बैश में के रूप में पाइप | का उपयोग इस

zcat /var/log/fail2ban.log* | gawk '/.*Ban.*/ {print $7};' | sort | uniq -c | sort | gawk '{ "geoiplookup " $2 "| cut -f2 -d: " | getline geoip; print $2 "\t\t" $1 " " geoip}' 

कि लाइन की तरह तो awk के getline साथ एक चर में उत्पादन पुनर्प्राप्त अपने मूल के साथ अपने सर्वर से सभी प्रतिबंध लगा दिया आईपी प्रिंट होगा (देश) geoip-bin पैकेज का उपयोग कर।

gawk '{ "geoiplookup " $2 "| cut -f2 -d: " | getline geoip; print $2 "\t\t" $1 " " geoip}' 

यह बस का कहना है:: आदेश "geoiplookup 182.193.192.4 | -f2 -d:" ($ 2 प्रतिस्थापित हो जाता है आप अनुमान लगा सकता है) चलाने के लिए और है कि आदेश का परिणाम डाल

कि एक लाइनर के अंतिम भाग हमें प्रभावित करता है कि एक है geoip में (| getline geoip बिट)। इसके बाद, geoip चर के अंदर कुछ और कुछ प्रिंट करें।

पूरा उदाहरण और परिणाम here, एक लेख मैंने लिखा है।

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