গ্রেপ সত্য / মিথ্যা ফিরে আসতে পারে বা বিকল্প পদ্ধতি আছে


130

এই স্ক্রিপ্টের অংশ হিসাবে, আমাকে দেওয়া প্রথম যুক্তিটি ফাইলের প্রথম শব্দের সাথে মিলছে কিনা তা খতিয়ে দেখার দরকার। যদি এটি হয় তবে একটি ত্রুটি বার্তা সহ প্রস্থান করুন; যদি এটি না হয় তবে ফাইলটিতে যুক্তি যুক্ত করুন। আমি বুঝতে পারি কীভাবে ifবিবৃতিটি লিখতে হয় , তবে grepকোনও স্ক্রিপ্টের মধ্যে কীভাবে ব্যবহার করতে হয় তা নয় । আমি বুঝতে পারি যে grepএরকম কিছু দেখাবে

grep ^$1 schemas.txt

আমি মনে করি এটি তৈরি করার চেয়ে অনেক সহজ হওয়া উচিত।

আমি ifবিবৃতিতে একটি "অনেক যুক্তি" ত্রুটি পেয়েছি । আমি এর মধ্যবর্তী স্থান থেকে মুক্তি পেয়েছি grep -qএবং তারপরে ত্রুটিযুক্ত বাইনারি অপারেটরটি পেয়েছি।

if [ grep -q ^$1 schemas.txt ]
then
        echo "Schema already exists. Please try again"
        exit 1
else
        echo "$@" >> schemas.txt
fi

1
হারান []এবং এটি কাজ করবে। যদিও আপনি সম্ভবত আপনার if grep -q "^$1" schemas.txt; then …
নিদর্শনটি

বাশের "গ্রুপ কমান্ড" বৈশিষ্ট্যটি ব্যবহার করে একটি লাইন সমাধান: স্ট্যাকওভারফ্লো
ট্রেভর বয়েড স্মিথ

উত্তর:


186

grepকিছু খুঁজে পাওয়া গেলে একটি আলাদা প্রস্থান কোড ফেরৎ দেয় (শূন্য) বনাম। যদি এটি কিছু না পেয়ে থাকে (শূন্য নয়)। একটি ifবিবৃতিতে, একটি শূন্য প্রস্থান কোডটি "সত্য" এ ম্যাপ করা হয় এবং একটি শূন্য-বহির্গমন প্রস্থান কোডটি মিথ্যাতে ম্যাপ করা হয়। এছাড়াও, ম্যাচযুক্ত -qপাঠ্য আউটপুট না করার জন্য গ্রেপের একটি যুক্তি রয়েছে (তবে কেবল প্রস্থান স্থিতি কোডটি ফেরত পাঠাতে)

সুতরাং, আপনি এরকম গ্রেপ ব্যবহার করতে পারেন:

if grep -q PATTERN file.txt; then
    echo found
else
    echo not found
fi

একটি দ্রষ্টব্য নোট হিসাবে, আপনি যখন এই জাতীয় কিছু করেন if [ -z "$var" ]…, তখন দেখা যায় যে [আসলে একটি কমান্ড যা আপনি চালাচ্ছেন, ঠিক গ্রেপের মতো। আমার সিস্টেমে, এটি /usr/bin/[। (আচ্ছা, প্রযুক্তিগতভাবে, আপনার শেলটি সম্ভবত এটি অন্তর্নির্মিত রয়েছে, তবে এটি একটি অপ্টিমাইজেশান It এটি কোনও কমান্ডের মতো আচরণ করে)। এটি একইভাবে কাজ করে, [সত্যের জন্য একটি শূন্য প্রস্থান কোড দেয় , মিথ্যাটির জন্য একটি শূন্য-বহির্গমন কোড। ( সমাপ্তি ব্যতীত testএকই জিনিস )[]


যদি বিবৃতিতে বন্ধনী প্রয়োজন হয় না কেন? আমি এটি ছাড়া কাজ করছি, তবে কেন বুঝতে পারছি না। আমি এখনও বন্ধনীগুলি ছাড়া এটি বাসাতে পারি?
লরেন

@ লরেন আপনি কি দ্রুত নোটটি মিস করেছেন? [যদি সিনট্যাক্সের অংশ না হয়, তবে এটি (ধারণামূলকভাবে) আপনি যে কমান্ডটি চালাচ্ছেন,
গ্রেপের

2
@ লরেন আপনি কোন অবস্থার পরীক্ষা করতে চান তার উপর নির্ভর করে আপনি [এর ভিতরে গ্রেপ ব্যবহার করেন না, আপনি একটি বা অন্যটি ব্যবহার করেন। (আপনি যদি কোনও বিটিডব্লিউ, যদি কেবল প্রস্থান কোডটি পরীক্ষা করে থাকেন তবে আপনি কোনও কমান্ড ব্যবহার করতে পারেন) ... ভাল, আমি অনুমান করি আপনি সম্ভবত অভ্যন্তরে গ্রেপ ব্যবহার করার কারণ নিয়ে আসতে পারেন [, তবে এটি একটি মোটামুটি জটিল স্ক্রিপ্ট এবং এটির কোনও সাধারণ জিনিস নয়।
ডার্বার্ট

3
এফওয়াইআই, চালান ls -l /usr/bin/\[এবং man [এটি যে [কোনও প্রোগ্রামের মতো দেখতে এটি কেবল একটি সিন্ট্যাক্টিক উপাদানটির মতো দেখাচ্ছে - এটি এটি স্পষ্ট এবং বুঝতে সহজ হওয়া উচিত। (সুবিধার্থে, [ব্যাশ, ড্যাশ এবং অন্যান্যগুলিও অন্তর্নির্মিত - তবে এটি এখনও একটি আদেশ)। type -all [বাশ চেষ্টা করুন ।
ক্যাস

1
@ আলেকজান্ডারসস্কা যদি আপনি গ্রেপ চান তবে ম্যাচযুক্ত লাইনগুলি মুদ্রণ করুন (উদাহরণস্বরূপ, সেগুলি কোথাও পাইপ দেওয়া), তারপরে বাদ দিন -q, এই বিকল্পটি গ্রেপকে শান্ত থাকতে বলে (মিলিত লাইনগুলি প্রিন্ট না করে)।
ডারোবার্ট

47

আর একটি সহজ উপায় হ'ল ব্যবহার করা grep -c

ফলাফলগুলি (বহির্গমন কোড হিসাবে প্রত্যাবর্তন নয়), প্যাটার্নের সাথে মেলে এমন লাইনের সংখ্যা, সুতরাং কোনও মিল না থাকলে 0 বা কোনও ম্যাচ না থাকলে 1 বা আরও বেশি।

সুতরাং, যদি আপনি 3 বা ততোধিক বার প্যাটার্নটি মেলে কিনা তা পরীক্ষা করতে চান তবে আপনি এটি করতে পারেন:

if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
  ...

17
আরও স্পষ্টভাবে, এটি একবারে পাওয়া গেলে 1 আউটপুট হবে । আউটপুট 1 এর জন্য নির্ধারিত মিলগুলির পরিমাণ নির্বিশেষে ব্যবহার grep -cim1করুন।
manatwork

এই পদ্ধতিটি গ্রেপ ত্রুটি এবং গ্রেপ '0 বার পাওয়া যায় নিদর্শন' এর মধ্যে পার্থক্য করতেও ব্যবহার করা যেতে পারে। (যদিও বিবৃতিটি সঠিকভাবে ব্যবহৃত না হলেও, আমি মনে করি একটি পরিবর্তনশীল প্রয়োজন)
ইভান বেন

3

আমি জানি আমি এটির জন্য দেরী করেছি, তবে আমি এই সংক্ষিপ্ত সংস্করণটি পছন্দ করি:

grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt

0

আমরা যদি কোনও ফাইলের প্রথম শব্দটি ধরতে চাই তবে -zwআমাদের গ্রেপ যুক্ত করতে হবে

if grep -qzw "^$1" file
then 
   ... 
else 
   ... 
fi

-zআমরা ছাড়া একটি লাইনের প্রথম শব্দ পাওয়া যায়। -wআমরা আংশিক শব্দ না পেয়ে।


-2

আপনি যদি এটি বর্গক্ষেত্র বন্ধনীর সাথে ব্যবহার করতে চান তবে আপনি নীচে সম্পাদন করতে পারেন

if [ `grep -q PATTERN file.txt` ]; then
    echo found
else
    echo not found

এই যুক্তিটি সমস্ত কমান্ডের জন্য কাজ করে, আপনার কমান্ডগুলি কেবল ব্যাকটিকের ভিতরে রাখুন (ট্যাবের উপরের বোতামটি বা এসসি বোতামের নীচে বা 1 বোতামের বামে)


1
আপনাকে উদ্ধৃতি দিতে হবে `grep -q PATTERN file.txt`, অন্যথায় স্প্লিট + গ্লোব অপারেটর প্রয়োগ করা হয়েছে এবং এর ফলে যে কোনও আউটপুটে $IFSবা ওয়াইল্ডকার্ডের অক্ষর রয়েছে তা সমস্যার কারণ হতে পারে । আরও সাধারণভাবে, [ "`cmd`" ]যদি cmdস্টডআউটে কমপক্ষে একটি খালি-ফাঁকা লাইন আউটপুট দেয় (সম্ভাব্য সমস্যাগুলির সাথে যদি এটি এনএল বাইটসকে আউটপুট করে দেয় তবে) সত্য হবে। তার মানে শেলটিকে পুরো আউটপুট মেমরিতে সংরক্ষণ করতে হবে এবং এটি শেষ হওয়ার জন্য অপেক্ষা করতে হবে। if cmd | grep -q .পরিবর্তে ব্যবহার করা সেই ক্ষেত্রে ভাল।
স্টাফেন চেজেলাস

এই কমান্ডটি মোটেই কোনও অর্থবোধ করবে না। -qস্যুইচটির উদ্দেশ্য হ'ল আউটপুট দমন করা grep । আপনি বলছেন: file.txt এ PATTERN এর জন্য পরীক্ষা করুন, যে কোনও আউটপুট দমন করুন, তারপরে PATTERN পাওয়া গেছে কিনা সে অনুযায়ী ফিরতি স্থিতি নির্ধারণ করুন। তারপরে, রিটার্নের স্থিতিটি উপেক্ষা করুন, কমান্ড আউটপুট নিন (যা আমরা খালি হতে বাধ্য করেছি), শব্দ বিভাজন প্রয়োগ করুন এবং গ্লোব এক্সপেনশন ফাইল করুন (ফলস্বরূপ কোনও যুক্তিই ফলস্বরূপ নয়), তারপরে [(ওরফে test) কমান্ডটি ঠিক একটি যুক্তি দিয়ে চালান - যথা - , ]- এবং তারপরে, যেহেতু এর ফলে একটি ত্রুটি ঘটবে, প্রতিধ্বনি "পাওয়া যায়নি"। @ স্টাফেনচাজেলাস, আমি কি কিছু মিস করেছি?
ওয়াইল্ডকার্ড

1
@ উইল্ডকার্ড, আপনি ঠিক বলেছেন, আমি স্পষ্টতই এটিকে উপেক্ষা করেছি -q। এই মন্তব্যটি উপলব্ধি করতে পারত [ `grep PATTERN file.txt ` ], তবে মন্তব্যে ইঙ্গিত হিসাবে, [ "`grep -n PATTERN file.txt`" ]প্যাটার্ন কেবল খালি লাইনের সাথে মেলে যদি ভাল হয়। যদিও এখানে অবশ্যই এটি if grep -q PATTERN file.txtআপনি চান।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.