2012-07-02 11 views
155

का उपयोग करके किसी फ़ाइल में एक विशिष्ट स्ट्रिंग है या नहीं, यह जांचना है कि फ़ाइल में कोई विशिष्ट स्ट्रिंग है या नहीं। मैं इस स्क्रिप्ट का इस्तेमाल किया है, लेकिन यह काम नहीं करता है:बैश

if [[ 'grep 'SomeString' $File' ]];then 
    Some Actions 
fi 

क्या मेरी कोड में गलत क्या है?

+2

http://stackoverflow.com/questions/4749330/how-to-test-if-string-exists-in-file-with-bash-shell – Pawel

उत्तर

299
if grep -q SomeString "$File"; then 
    Some Actions # SomeString was found 
fi 

आपको यहां [[ ]] की आवश्यकता नहीं है। बस सीधे आदेश चलाएं। -q विकल्प जोड़ें जब आपको मिलने वाली स्ट्रिंग की आवश्यकता नहीं होती है।

grep कमांड पर खोज के परिणाम के आधार पर निकास कोड में 0 या 1 देता है। 0 अगर कुछ मिला था; 1 अन्यथा।

$ echo hello | grep hi ; echo $? 
1 
$ echo hello | grep he ; echo $? 
hello 
0 
$ echo hello | grep -q he ; echo $? 
0 

आप if की स्थिति के रूप में आदेश निर्दिष्ट कर सकते हैं। यदि आदेश अपने एक्जिकोड में 0 देता है जिसका अर्थ है कि स्थिति सत्य है; अन्यथा झूठी।

$ if /bin/true; then echo that is true; fi 
that is true 
$ if /bin/false; then echo that is true; fi 
$ 

जैसा कि आप देख सकते हैं कि आप यहां सीधे कार्यक्रम चलाते हैं। कोई अतिरिक्त [] या [[]]

+1

के लिए धन्यवाद प्रिय इगोर, बहुत अच्छा जवाब और पूर्ण ... मैंने इस पोस्ट से बहुत कुछ सीखा। – Hakim

+0

'grep' के बारे में अधिक जानकारी और asnwer में उपलब्ध विकल्पों http://stackoverflow.com/a/4749368/1702557 – Pawel

+1

शायद http://stackoverflow.com/a/4749368/544721 में '-Fxq' मानकों पर विचार करना चाहें स्कैनिंग प्रदर्शन को बेहतर बनाने के लिए –

-1
grep -q "something" file 
[[ !? -eq 0 ]] && echo "yes" || echo "no" 
+1

आपके पास एक टाइपो है -! $ होना चाहिए माना जाता है? – lzap

+0

... न केवल यह '$?' होने का इरादा है, लेकिन इसकी कोई आवश्यकता नहीं है - आप केवल 'अगर grep -q ... ' –

+0

कर सकते हैं, इसके अलावा,' foo && truthy_action || falsey_action' वास्तविक टर्नरी ऑपरेटर नहीं है - यदि 'सत्य_एक्शन' विफल रहता है, तो 'falsey_action' चला जाता है _in addition_। –

0

सबसे छोटा (सही) संस्करण:

grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no" 

भी

grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no" 

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

grep -q "something" file && echo "yes" || echo "no" 
+0

'अगर grep -q कुछ फ़ाइल; फिर हां गूंजें; अन्य गूंज नहीं; fi'। '$? 'के साथ गड़बड़ करने का कोई कारण नहीं है। –

0

मैंने ऐसा किया, ठीक काम करने लगता है

if grep $SearchTerm $FileToSearch; then 
    echo "$SearchTerm found OK" 
else 
    echo "$SearchTerm not found" 
fi 
21

अन्य उत्तरों के अलावा, जो आपको बताया गया था कि आप क्या करना चाहते हैं, मैं समझाने की कोशिश करता हूं कि क्या गलत था (जो आप चाहते थे।

बैश में, if को आदेश के साथ पालन किया जाना है। यदि इस आदेश का निकास कोड 0 के बराबर है, तो then भाग निष्पादित किया गया है, अन्यथा else भाग यदि कोई निष्पादित किया गया है।

आप है कि किसी भी आदेश के साथ अन्य उत्तर में बताई गई विधि कर सकते हैं: if /bin/true; then ...; fi

[[ एक आंतरिक बैश फ़ाइल अस्तित्व, चर तुलना की तरह, कुछ परीक्षण करने के लिए समर्पित आदेश है। इसी तरह [ एक बाहरी कमांड है (यह आमतौर पर /usr/bin/[ में स्थित है) जो लगभग समान परीक्षण करता है लेकिन अंतिम तर्क के रूप में ] की आवश्यकता होती है, यही कारण है कि ] को बाईं ओर एक स्थान के साथ गद्देदार होना चाहिए, जो ]] के मामले में नहीं है।

यहां आपको [[ और न ही [ की आवश्यकता है।

एक और बात यह है कि आप चीजों को उद्धृत करते हैं। बैश में, केवल एक ही मामला है जहां उद्धरण के जोड़े घोंसला करते हैं, यह "$(command "argument")" है।लेकिन 'grep 'SomeString' $File' में आपके पास केवल एक शब्द है, क्योंकि 'grep ' एक उद्धृत इकाई है, जिसे SomeString के साथ जोड़ा गया है और फिर ' $File' के साथ फिर से सम्मिलित है। एकल उद्धरण के उपयोग के कारण परिवर्तनीय $File को इसके मूल्य के साथ भी प्रतिस्थापित नहीं किया गया है। ऐसा करने का उचित तरीका grep 'SomeString' "$File" है।

7
##To check for a particular string in a file 

cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directory 
File=YOUR_FILENAME 
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File"; ##note the space after the string you are searching for 
then 
echo "Hooray!!It's available" 
else 
echo "Oops!!Not available" 
fi 
+0

निर्देशिका बदलना आमतौर पर एक अच्छा विचार नहीं है (और यहां पूरी तरह से अनावश्यक है, केवल लक्ष्य निर्देशिका के साथ फ़ाइल नाम योग्य करें)। और फिर आपके पास जो कुछ भी है, वह स्वीकार्य उत्तर के समान ही है, केवल कम विवरण के साथ। – Mat

+0

सलाह मैट के लिए धन्यवाद –

1
if grep -q [string] [filename] 
then 
    [whatever action] 
fi 

उदाहरण

if grep -q 'my cat is in a tree' /tmp/cat.txt 
then 
    mkdir cat 
fi 
3
grep -q [PATTERN] [FILE] && echo $? 

बाहर निकलें स्थिति 0 (सही) है अगर पैटर्न मिला था;

0

मामले में आप स्ट्रिंग checkif करना चाहते हैं पूरी पंक्ति से मेल खाता है और अगर यह एक निश्चित स्ट्रिंग है, आप इसे इस तरह

grep -Fxq [String] [filePath] 

उदाहरण

searchString="Hello World" 
file="./test.log" 
if grep -Fxq "$searchString" $file 
    then 
      echo "String found in $file" 
    else 
      echo "String not found in $file" 
fi 

आदमी फ़ाइल से कर सकते हैं:

-F, --fixed-strings 

      Interpret PATTERN as a list of fixed strings, separated by newlines, any of 

which is to be matched. 
      (-F is specified by POSIX.) 
-x, --line-regexp 
      Select only those matches that exactly match the whole line. (-x is specified by 

POSIX.) 
-q, --quiet, --silent 
      Quiet; do not write anything to standard output. Exit immediately with zero 

status if any match is 
      found, even if an error was detected. Also see the -s or --no-messages 

option. (-q is specified by 
      POSIX.) 
0

इस प्रयास करें:

if [[ $(grep "SomeString" $File) ]] ; then 
    echo "Found" 
else 
    echo "Not Found" 
fi