जाग: एक वापसी की स्थिति मजबूर?


18

यह मेरे पहले के प्रश्न का अनुसरण है ।

मैं इस आसान स्निपिट का उपयोग करके / etc / passwd में फ़ील्ड की संख्या को मान्य कर रहा हूं। निम्नलिखित उदाहरण में, उपयोगकर्ताओं 'fieldcount1' और 'fieldcount2' में फ़ील्ड की गलत संख्या है:

$ awk -F: ' NF!=7 {print}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
fieldcount2:blah::blah:1002:100:fieldcount2:/home/fieldcount2:/bin/bash:
$ echo $?
0

जैसा कि आप देखेंगे, awk 0. की वापसी स्थिति के साथ बाहर निकल जाएगा। यह दृष्टिकोण से, यहाँ कोई समस्या नहीं है।

मैं इस अजीब कथन को एक शेल स्क्रिप्ट में शामिल करना चाहूंगा। मैं उन सभी लाइनों को प्रिंट करना चाहूंगा जो त्रुटि हैं, और रिटर्न कोड को 1 (त्रुटि) सेट करें।

मैं एक विशेष निकास स्थिति को मजबूर करने की कोशिश कर सकता हूं, लेकिन फिर केवल एक लाइन को प्रिंट करता है:

$ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
$ echo $?
1

क्या मैं, 1 ’की वापसी स्थिति के साथ बाहर निकलने के लिए जाग सकता हूं, और सभी पंक्तियों को प्रिंट कर सकता हूं जो मेल खाते हैं?

जवाबों:


23

एक चर में स्थिति रखें और इसे एक ENDब्लॉक में उपयोग करें ।

awk -F: 'NF != 7 {print; err = 1}
         END {exit err}' /etc/passwd

बहुत अच्छा। हालाँकि मैं इसे बैश स्क्रिप्ट में शामिल करने वाली समस्याओं में चल रहा हूँ। मैं इस awk statement के ; echo $?बाद कुछ इस तरह से जोड़कर इस awk statement की return स्थिति पर कब्जा करने की कोशिश कर रहा हूँ । हालाँकि, echo $?कभी नहीं चलाया जाता है क्योंकि END {exit err}'स्क्रिप्ट को समाप्त कर देता है। क्या बाहर निकलने के बिना वापसी की स्थिति निर्धारित करने का एक तरीका है?
स्टीफन लासिवस्की

6
@StefanLasiewski exit errawk को समाप्त करता है, यह स्क्रिप्ट को समाप्त नहीं करता है। क्या आपके पास set -eउस स्क्रिप्ट में, किसी भी संयोग से है? यदि ऐसा है, तो आपने शेल से बाहर निकलने के लिए कहा है यदि कोई कमांड नॉनज़ेरो स्थिति देता है; यदि आप स्थिति का परीक्षण करना चाहते हैं, तो उपयोग करें if awk …; then echo ok; else echo fail; fi
गिल्स एसओ- बुराई को रोकना '

@ गिल्स: हाँ, यह स्क्रिप्ट set -eसेट है। यह अजीब व्यवहार की व्याख्या करता है जो मैं देख रहा हूं। यह बात बताने के लिए धन्यवाद।
स्टीफन लासवर्स्की

1
यदि आप बैश के &&ऑपरेटर के साथ आउटपुट का उपयोग करने की योजना बनाते हैं , तो यह ध्यान में रखने योग्य है कि "0 सच है लेकिन गलत है शेल में 1"
स्किप्पी ले ग्रैंड गौरू

8

मैं ग्रेप के समान कुछ खोज रहा था, जहां यह 1 से बाहर निकल जाएगा यदि एक मैच नहीं मिला। यहाँ Awk के साथ समकक्ष है:

#!/usr/bin/awk -f
BEGIN {
   b1 = 1
}
index($0, "sunday") > 0 {
   b1 = 0
   print
}
END {
   exit b1
}

0

यह ओपी की सटीक आवश्यकताओं का जवाब नहीं देता है, लेकिन यदि आप केवल रिटर्न कोड के बारे में परवाह करते हैं, और मैच के समान लाइनों को प्रिंट करने की आवश्यकता नहीं है grep -q, तो आप पहले मैच के बाद बाहर निकलने के लिए @geekasaur उत्तर को संशोधित कर सकते हैं, जो विशाल इनपुट के लिए यदि फ़ाइल में त्रुटि जल्दी होती है तो फ़ाइलें समय बचाएंगी। उम्मीद /etc/passwdहै कि आप के लिए योग्य नहीं है!

awk -F: 'NF != 7 {err = 1; exit;}
     END {exit err}' /etc/passwd

1
awk -F: 'NF != 7 {exit 1}'वैसा ही करेंगे।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.