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


265

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

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

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


2
करने के लिए इसी तरह के stackoverflow.com/questions/4749330/...
पावेल

यहां बताया गया है कि command: a : stackoverflow.com/questions/12375722/…
rogerdpack

जवाबों:


464
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
$

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



2

3
-m 1स्कैनिंग प्रदर्शन को बेहतर बनाने के लिए उपयोग करने पर विचार करें । पहली घटना पर लौटता है।
एलिकएल्ज़िन-किलाका

1
यदि SomeStringregex में विशेष वर्ण (जैसे .) हैं तो आपको अप्रत्याशित परिणाम मिल सकते हैं। यह हमेशा fgrep(या grep -F) का उपयोग करने के लिए सुरक्षित है (जब तक आपको वास्तव में एक regex की आवश्यकता नहीं होती है, उस स्थिति में egrep(या grep -E) शायद सबसे अच्छा विकल्प है)
Walter Tross

उदाहरण का ifउदाहरण गलत है, क्योंकि यह केवल जांचता है कि निकास कोड गैर-0 था या नहीं। यदि कोई त्रुटि होती है, जैसे फ़ाइल को पढ़ा नहीं जा सकता, तो बाहर निकलने का कोड भी गैर-0 है। इसलिए आपको कुछ करना होगा ec=$?, और जांचें कि क्या यह 0(पाया गया) है, अगर यह 1(नहीं मिला है), और फिर अगर यह कुछ और है (असफल)।
ddekany

40

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

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

आप किसी भी कमांड के साथ ऐसा कर सकते हैं जैसा कि अन्य उत्तरों में बताया गया है: if /bin/true; then ...; fi

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

यहाँ आप की जरूरत नहीं है [[और न ही [

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


15

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

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

10
##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

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

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

7

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

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"

3
if grep -q something file; then echo yes; else echo no; fi। किसी के साथ खिलवाड़ करने का कोई कारण नहीं $?
चार्ल्स डफी

6

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

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.)

6
grep -q [PATTERN] [FILE] && echo $?

निकास की स्थिति 0(सच) है यदि पैटर्न मिला था; अन्यथा कंबल।


4
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

2

इसे इस्तेमाल करे:

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

3
मैं हिचकिचाते हुए इसे नीचा दिखाने से बच रहा हूं, लेकिन स्टैक ओवरफ्लो को इस तरह के प्रेट्ज़ेल लॉजिक को खत्म नहीं करना चाहिए। grepएक बहुत अच्छे कारण के लिए एक निकास स्थिति देता है; एक स्ट्रिंग में आउटपुट कैप्चर करना संभवतः एक बड़ी मात्रा में टेक्स्ट को एक बफर में स्टोर करने वाला है, ताकि आप कह सकें कि यह गैर-खाली है।
3


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

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

... न केवल यह होने का इरादा है $?, लेकिन इसके लिए कोई ज़रूरत नहीं है - आप बस कर सकते हैंif grep -q ...
चार्ल्स डफी

1
इसके अलावा, foo && truthy_action || falsey_actionएक असली टर्नरी ऑपरेटर नहीं है - अगर truthy_actionविफल रहता है, तो इसके अलावाfalsey_action भाग जाता है ।
चार्ल्स डफी

आम तौर पर, उद्देश्य के ifएक आदेश चला और उसके बाहर निकलने के कोड की जांच करने के लिए। आपको $?स्पष्ट रूप से जांच करने की बहुत कम आवश्यकता है ।
ट्रिपल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.