2015-06-24 7 views
5

मैं शैल स्क्रिप्टिंग का उपयोग करके लाइन द्वारा एक टेक्स्ट फ़ाइल लाइन पढ़ने की कोशिश कर रहा हूं। मैं क्या कर रहा हूंलाइन द्वारा टेक्स्ट फ़ाइल लाइन के माध्यम से पढ़ना और जांचना कि क्या उस पंक्ति में एक निश्चित स्ट्रिंग है

while read line 
do 
    var1=$(grep -s "Completed" $line) 
    var2=$(grep -s "Script Finished" $line) 

if[ "$var1" = "$line" ] 
    break 
else 
    if[ "$var2" = "$line" ] 
     count='expr $count + 1' 
    else 
     countinue 
    fi 
fi 
done < file.txt 

यदि आपके कोई सुझाव हैं तो कृपया मुझे बताएं! मैं अन्य विकल्पों के लिए खुला हूं क्योंकि मैं इस तरह से बहुत लंबा करने की कोशिश कर रहा हूं।

स्पष्ट करने के लिए:

मैं लाइन द्वारा एक फ़ाइल लाइन के माध्यम से जा रहा हूँ (पाश जबकि) तो मैं देखने के लिए अगर "पूर्ण" है कि लाइन grepping हूँ सबस्ट्रिंग है और देखने के लिए अगर "स्क्रिप्ट तैयार" grepping एक सबस्ट्रिंग है (Grep चर को पूरी रेखा में सेट करेगा)। तो जब मैं चर को पूरा करता हूं तो चेक करता हूं, तो मैं थोड़ी देर के अंतराल से बाहर निकलना चाहता हूं, अगर यह जांच न हो कि "स्क्रिप्ट समाप्त" एक सबस्ट्रिंग है तो मैं एक काउंटर बढ़ा सकता हूं (मैं यह समझने की कोशिश कर रहा हूं कि कितनी स्क्रिप्ट समाप्त हो गई हैं " पूर्ण")।

भ्रमित के बारे में:

जब मैं कर var1 = $ (ग्रेप -s $ लाइन "पूर्ण") कारण है कि यह पूरे के सभी उदाहरणों मिल रहा है ... मैंने सोचा था कि अगर im लाइन द्वारा लाइन से गुजर रही यह केवल उस निश्चित पंक्ति में उदाहरण पाएंगे।

संपादित करें:

मैं नीचे awk जवाब का इस्तेमाल किया। मुझे बस इतना करना था कि {अगला} कथन हटा दें और यह पूरी तरह से काम करता है।

धन्यवाद

+2

आप इसके साथ क्या हासिल करने की कोशिश कर रहे हैं? क्या आप उस पर कुछ जानकारी दे सकते हैं? –

+0

हां निश्चित रूप से मेरी माफ़ी। मैं एक फ़ाइल के माध्यम से जाने की कोशिश कर रहा हूं जो स्क्रिप्ट चलाए जाने पर सूचीबद्ध करता है। तो मुझे केवल तभी ख्याल है जब कोई स्क्रिप्ट समाप्त हो जाती है .. यदि यह समाप्त हो जाए तो मैं काउंटर को बढ़ा दूंगा। हालांकि, स्क्रिप्ट ब्लॉक में चलती हैं .. सुबह दोपहर और रात। तो मैं लूप को "ब्ला ब्लाह" (स्क्रिप्ट पूर्ण) के साथ तोड़ रहा हूं क्योंकि सुबह – Alan

+2

में समाप्त होने वाली स्क्रिप्ट की मात्रा होगी, यदि आप ऐसा करने की कोशिश नहीं करते हैं तो आपको ऐसा करने और प्रासंगिक संसाधनों को खोजने में बहुत आसान समय होगा यह सब एक बार में, और इसके बजाय अलग-अलग हिस्सों को काम करने पर ध्यान केंद्रित करते हैं। उदाहरण के लिए, आपको दो स्ट्रिंग्स 'ए = "हैलो वर्ल्ड" बी = "पांडा" को परिभाषित करना चाहिए और अगर उन्हें तुलना करने वाले एक कथन को लिखने का प्रयास करें (और उसके बाद' बी = $ ए 'सेट करना सुनिश्चित करें कि सकारात्मक और नकारात्मक दोनों मामले काम करते हैं)। Google के लिए "मैं एक शेल स्क्रिप्ट में तारों की तुलना कैसे करूं" की तुलना में बहुत आसान है "लाइन लाइन द्वारा टेक्स्ट फ़ाइल लाइन के माध्यम से मैं कैसे पढ़ूं यदि उस पंक्ति में एक निश्चित स्ट्रिंग है"। –

उत्तर

4

आपके पास कई त्रुटियां हैं। इसके अलावा आप इस तरह की चीज करने के लिए एक उपकरण पर विचार करना चाह सकते हैं। अजीब उन उपकरणों में से एक है।

awk '/blah blah/ {exit} 
    /Finished/ {count+=1} 
    {next} 
    END{ print count} ' filename 

पहली पंक्ति छोड़ देता है यह मेल खाता है "blah blah" लाइन पर कहीं भी।

दूसरी पंक्ति "समाप्त" मैचों की संख्या की गणना करती है।

{अगला} बिट पढ़ने के लिए है और हर पंक्ति मुद्रित नहीं है - यह अजीब के कुछ संस्करणों में होता है।

अंतिम पंक्ति, END {} फ़ंक्शन, जब कोड फ़ाइल को पूरा करता है तब चलता है। यह गिनती का मूल्य प्रदर्शित करता है।

मैंने शैल स्क्रिप्ट में तर्क और वाक्यविन्यास त्रुटियों को ठीक करने की कोशिश करने के बजाय अजीब दृष्टिकोण चुना है। अगर आपको उस तरह की मदद की ज़रूरत है तो कमांड लाइन पर कोड के लगभग हर ब्लॉक (या लाइन) को खेलने पर विचार करें। मुझे लगता है कि आप बैश का इस्तेमाल कर रहे हैं।

त्रुटियाँ उदाहरण

-eq to compare strings, use =, example: [ "$var" = "something" ] 
$(var1) should be either "${var1}" or "$var1" lines 4 and 8 

ग्रेप एक पूरी लाइन देता है, आप परीक्षण कर रहे हैं "blah blah" और सिर्फ और सिर्फ "blah blah" उम्मीद पूरे परिणाम के रूप में?

+0

मैं अभी यह कोशिश करने जा रहा हूं .. आपके उत्तर के लिए धन्यवाद, मैं आपको बता दूंगा कि क्या होता है। मैं $ लाइन के खिलाफ grep blah blah $ line का परीक्षण कर रहा हूं .. लेकिन आपका तरीका बहुत बेहतर लगता है। मैंने सुना है कि आसानी से grep को प्रतिस्थापित कर सकते हैं। – Alan

+0

'awk '/ Completed/{exit} /समाप्त/{गिनती + = 1} {अगला} अंत {प्रिंट गिनती}' फ़ाइल नाम 'एक अनंत लूप – Alan

+0

में इसकी तरह लगता है! बहुत बहुत धन्यवाद। – Alan

2

# 1 त्रुटि:

जब मैं var1 = $ (ग्रेप -s "पूर्ण" $ लाइन) कारण है कि यह पूरे

के सभी उदाहरणों उपरोक्त आदेश grep में मिल रहा है है $line एक फ़ाइल नाम होने के लिए एक स्ट्रिंग नहीं है।

var1=$(echo "$line" | grep -s "Completed") 

या बैश में आप स्ट्रिंग पुनर्निर्देशन उपयोग कर सकते हैं:

var1=$(grep -s "Completed" <<<"$line") 

# 2 त्रुटि:

if और बीच की जगह होनी चाहिए आप स्ट्रिंग पारित करने के लिए चाहते हैं तो आप पाइप उपयोग करने की आवश्यकता [ ([test आदेश है)


grep -v "Completed" file.txt | grep -c "Script Finished" 

grep -v "Completed" file.txt रिटर्न युक्त नहीं लाइनों "पूर्ण" और पाइप जो लाइन गिनती रिटर्न के माध्यम से अगले grep के लिए भेजता है:यह grep आदेश शायद ही के रूप में आपको लगता है कि कोड के साथ क्या करने की कोशिश कर रहे हैं क्या करेंगे जिसमें "स्क्रिप्ट समाप्त" टेक्स्ट शामिल है।

+1

स्पष्टीकरण के लिए धन्यवाद। और grep का उपयोग करने का चालाक तरीका। – Alan

1

मैं इसे (वर्तमान) स्वीकृत समाधान के बाद पोस्ट कर रहा हूं क्योंकि स्वीकृत समाधान एक ऐसी भाषा में है जो टैग द्वारा कवर नहीं है।

आप केस स्टेटमेंट का उपयोग कर खोल में एक ही चीज़ कर सकते हैं। (हालांकि बड़ी फ़ाइलों, awk या ग्रेप तेजी से हो सकता है के लिए)

while read line; do 
case "$line" in 
    *"Completed"*)break;; 
    *"Script Finished"*)count=$((count + 1));; 
esac 
done < file.txt 

ध्यान दें: while read line; के इस फार्म ... अंतिम पंक्ति को छोड़ देगा, अगर वह ठीक नहीं है, while read line || [ "$line" ] का उपयोग (यह 1 कारण है कि है कुछ आईडीई फाइलों के अंत में एक खाली नई लाइन जोड़ देंगे)

+0

ओह मैंने उसे पकड़ नहीं लिया! धन्यवाद – Alan

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

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