2010-10-15 14 views
12

निम्नलिखित स्क्रिप्ट भाग प्रत्येक पंक्ति को $next में पढ़ता है। लेकिन जब मैं $next में "MO" यानी खास पैटर्न grep करने की कोशिश, त्रुटि के रूप में मानक आउटपुट पर दिखाया जाता है:आईएफ कथन में grep

grep: 40922|OPR: No such file or directory 
grep: MO: No such file or directory 
grep: 12345|OPR: No such file or directory 
grep: MO: No such file or directory 
grep: 12345|12345|202|local|LMNO: No such file or directory 

cat /home/scripts/$E1.out | while read next 
do 
i=`echo $next | awk -F"|" '{print($1)}'` 
j=`echo $next | awk -F"|" '{print($2)}'` 
k=`echo $next | awk -F"|" '{print($3)}'` 
l=`echo $next | awk -F"|" '{print($4)}'` 
m=`echo $next | awk -F"|" '{print($5)}'` 
n=`echo $next | awk -F"|" '{print($6)}'` 
o=`echo $next | awk -F"|" '{print($6)}'` 
if grep -q "MO" $next 
then echo "FOUND;" >> /home/scripts/sql.$E1.out 
else echo "NOT FOUND;" >> /home/scripts/sql.$E1.out 
fi 
done 

$E1.out फ़ाइलों लगता है:

40922|OPR MO 12345|OPR MO 12345|12345|202|local|LMNO 
+0

एक अलग टिप्पणी पर, आप पढ़ने बदलकर awk के सभी आमंत्रण से बच सकते हैं कमांड कमांड: 'जबकि आईएफएस = "|" पढ़ें मैं जे के एल एम एन ओ; करें ... '(ध्यान दें कि यह सिर्फ पढ़ने के लिए IFS सेट करता है, इसलिए आपको इसे बाद में सेट करने की आवश्यकता नहीं है)। –

उत्तर

22

तर्क आप grep करने के लिए पारित, $next , को खोजने के लिए फ़ाइल नामों की एक सूची के रूप में माना जा रहा है। यदि आप स्ट्रिंग के लिए उस पंक्ति के भीतर खोजना चाहते हैं, तो MO कहें, तो आपको इसे किसी फ़ाइल में डालना होगा और उस फ़ाइल को तर्क के रूप में पास करना होगा, या इसे मानक इनपुट के माध्यम से पाइप करना होगा।

यहां एक उदाहरण है कि आप कमांड लाइन पर आज़मा सकते हैं; जाहिर है, वैरिएबल का शाब्दिक मूल्य के लिए प्रयोग कर रहे हैं विकल्प है कि मैं वर्णन करने के लिए शामिल हैं:

if echo "40922|OPR MO 12345|OPR MO 12345|12345|202|local|LMNO" | grep -q "MO" 
    then echo "FOUND" 
    else echo "NOT FOUND" 
fi 
+0

हम ऐसा नहीं कर सकते: अगर "$ अगला" गूंजें। grep -q "एमओ"? मेरा मतलब है कि मुझे लाइन से लाइन खोजनी है और $ E1.out में कई लाइनें हो सकती हैं। – ErAB

+0

@ आशीष हां, आप अगली "' echo "कर सकते हैं। जैसा कि मैंने कहा, मैंने चित्रण के उद्देश्य के लिए वहां शाब्दिक मूल्य रखा है, लेकिन इसके बजाय आप उस चर को डाल सकते हैं जिसका उपयोग आप वर्तमान लाइन को पकड़ने के लिए कर रहे हैं। –

0
if tmux ls | grep -q "ABC"; then echo "1"; else echo "2"; fi 
+0

आमतौर पर अज्ञात कोड की कुछ पंक्तियों को पोस्ट करने के बजाय समाधान की व्याख्या करना बेहतर होता है। आप पढ़ सकते हैं [मैं एक अच्छा जवाब कैसे लिखूं] (https://stackoverflow.com/help/how-to-answer), और [पूरी तरह से कोड-आधारित उत्तरों समझाएं] (https://meta.stackexchange.com/प्रश्न/114,762/समझा-entirely-% E2% 80% 8C% E2% 80% 8Bcode आधारित-जवाब)। –

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