বাশ ব্যবহার করে কোনও ফাইলটিতে একটি নির্দিষ্ট স্ট্রিং রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন


265

কোনও ফাইলের মধ্যে নির্দিষ্ট স্ট্রিং রয়েছে কিনা বাশে নেই তা আমি পরীক্ষা করতে চাই। আমি এই স্ক্রিপ্টটি ব্যবহার করেছি, তবে এটি কার্যকর হয় না:

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

আমার কোডে কি ভুল?



এখানে একটি আউটপুট grep করতে হয় তা দেখুন command: 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
$

আপনি দেখতে পাচ্ছেন যে আপনি সরাসরি প্রোগ্রামগুলি এখানে চালাচ্ছেন। কোন অতিরিক্ত []বা [[]]




3
-m 1স্ক্যানিং কর্মক্ষমতা উন্নত করার জন্য ব্যবহার বিবেচনা করুন । প্রথম ঘটনাটিতে ফিরে আসে।
অ্যালিক্লিজিন-কিলাকা

1
যদি SomeStringরেজেক্স বিশেষ অক্ষর থাকে (যেমন .) আপনি অপ্রত্যাশিত ফলাফল পেতে পারেন। সর্বদা fgrep(বা grep -F) ব্যবহার করা আরও নিরাপদ (যদি না আপনার সত্যিকারের একটি রেইজেক্স প্রয়োজন হয়, তবে egrep(বা grep -E) সম্ভবত সেরা পছন্দ)
ওয়াল্টার ট্রস ২ '

উদাহরণটির ifউদাহরণটি ভুল, কারণ এটি কেবলমাত্র পরীক্ষার করে যদি প্রস্থান কোডটি অ -0 হয়। যদি কোনও ত্রুটি ঘটে থাকে, যেমন ফাইলটি পড়া যায় না, প্রস্থান কোডটিও অ -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
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হয় একটি কমান্ড চালাতে এবং তার প্রস্থান কোড বার করো। আপনার খুব কমই $?স্পষ্টভাবে পরীক্ষা করা উচিত ।
ট্রিপল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.