বাশের সাথে ফাইলটিতে স্ট্রিং উপস্থিত থাকলে কীভাবে পরীক্ষা করবেন?


337

আমার কাছে একটি ফাইল রয়েছে যাতে ডিরেক্টরিতে নাম রয়েছে:

my_list.txt :

/tmp
/var/tmp

আমি বাশকে আগে যাচাই করতে চাই I'll নামটি যদি ফাইলে ইতিমধ্যে বিদ্যমান থাকে তবে আমি একটি ডিরেক্টরি নাম যুক্ত করব।


কোনও ফাইলের অভ্যন্তরে সমস্ত স্ট্রিং সন্ধান করতে আপনি ফর লুপে গ্রেপ
নোয়াম মানস

উত্তর:


655
grep -Fxq "$FILENAME" my_list.txt

নামটি পাওয়া গেলে প্রস্থান স্থিতি 0 (সত্য), 1 (মিথ্যা) না থাকলে, তাই:

if grep -Fxq "$FILENAME" my_list.txt
then
    # code if found
else
    # code if not found
fi

ব্যাখ্যা

ম্যান পৃষ্ঠারgrep সম্পর্কিত বিভাগগুলি এখানে রইল :

grep [options] PATTERN [FILE...]

-F, --fixed-strings

        PATTERN কে নতুন লাইনের দ্বারা পৃথক করা স্থির স্ট্রিংগুলির একটি তালিকা হিসাবে ব্যাখ্যা করুন, যার মধ্যে কোনওটি মিলে যেতে হবে।

-x, --line-regexp

        কেবল সেই ম্যাচগুলি নির্বাচন করুন যা পুরো লাইনের সাথে মেলে।

-q, --quiet,--silent

        শান্ত; স্ট্যান্ডার্ড আউটপুটে কিছু লিখবেন না। কোনও মিল খুঁজে পাওয়া গেলেও তাত্ক্ষণিক শূন্য স্থিতির সাথে প্রস্থান করুন, ত্রুটি সনাক্ত করা হলেও। এছাড়াও বিকল্প -sবা --no-messagesবিকল্পটি দেখুন।

ত্রুটি পরিচালনা

মতামতগুলিতে যথাযথভাবে নির্দেশিত হিসাবে, উপরের পদ্ধতিরটি নীরবে ত্রুটি কেসগুলির সাথে আচরণ করে যেমন স্ট্রিংটি পাওয়া গেছে। আপনি যদি অন্যভাবে ত্রুটিগুলি পরিচালনা করতে চান তবে আপনাকে -qবিকল্পটি বাদ দিতে হবে এবং প্রস্থান স্থিতির উপর ভিত্তি করে ত্রুটিগুলি সনাক্ত করতে হবে:

সাধারণত, নির্বাচিত লাইনগুলি পাওয়া গেলে এবং প্রস্থানের স্থিতি 0 হয় otherwise কিন্তু প্রস্থান অবস্থা 2 হলে, একটি ত্রুটি ঘটেছে যদি না -qবা --quietবা --silentবিকল্প ব্যবহার করা হয় এবং একটি নির্বাচিত লাইন পাওয়া যায়। উল্লেখ্য, যে POSIX শুধুমাত্র ম্যান্ডেট যেমন প্রোগ্রামের জন্য grep, cmpএবং diff, যে ত্রুটি ক্ষেত্রে প্রস্থান অবস্থা 1 থেকে বেশি হতে; সুতরাং পোর্টাবিলিটির জন্য, যুক্তি ব্যবহার করা বাঞ্ছনীয় যে এটি 2 এর সাথে কঠোর সাম্যের পরিবর্তে এই সাধারণ অবস্থার জন্য পরীক্ষা করে।

থেকে স্বাভাবিক আউটপুট দমন grepকরতে, আপনি এটিকে পুনর্নির্দেশ করতে পারেন /dev/null। নোট করুন যে স্ট্যান্ডার্ড ত্রুটিটি পুনঃনির্দেশিত থেকে যায়, সুতরাং যে কোনও ত্রুটি বার্তাগুলি grepমুদ্রণ করতে পারে সেগুলি কনসোলে আপনার পছন্দ হিসাবে শেষ হবে।

তিনটি কেস পরিচালনা করতে, আমরা একটি caseবিবৃতি ব্যবহার করতে পারি :

case `grep -Fx "$FILENAME" "$LIST" >/dev/null; echo $?` in
  0)
    # code if found
    ;;
  1)
    # code if not found
    ;;
  *)
    # code if an error occurred
    ;;
esac

2
যদি আমি বাশ স্ক্রিপ্ট থেকে এই আদেশটি কার্যকর করি তবে 0 বা 1 কে ভেরিয়েবলের মধ্যে কীভাবে ধরা যায়?
টোরেন

6
@ টোরেন সর্বাধিক সাম্প্রতিক প্রস্থান স্থিতি ব্যবহার করে অ্যাক্সেস করা যেতে পারে $?। আপনি ifস্টেটমেন্টের পাশাপাশি গ্রেপ কমান্ডটিও ব্যবহার করতে পারেন (আপডেট উত্তরে দেখানো হয়েছে)।
শান চিন

5
আপনি ব্যবহার করতে পারেন grep -Fqx "$FILENAME"এবং আপনাকে পরিবর্তনশীল বিষয়বস্তুতে রেজেক্স অক্ষর সম্পর্কে চিন্তা করতে হবে না এবং আপনাকে সেগুলি অনুসন্ধানের স্ট্রিংয়ে ব্যবহার করতে হবে না।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

4
এই উত্তরটির দিকে তাকিয়ে লোকদের জন্য কয়েকটি নোট: 1) ব্যাশে, 0 সর্বদা সত্য এবং অন্য কোনও কিছু সর্বদা মিথ্যা 2) আপনি যদি পুরো লাইনটি ঠিক মেলে চান তবে কেবল -x পতাকাটি ব্যবহার করুন। যদি আপনি কেবল ফাইলটিতে আপনার স্ট্রিংটি বিদ্যমান রয়েছে কিনা তা সন্ধান করতে চান তবে এটি ছেড়ে দিন। আপনার স্ট্রিংটি হুবহু উপস্থিত রয়েছে কিনা তা খুঁজে পেতে চাইলেও অগত্যা একটি সম্পূর্ণ লাইনের সাথে মিল না রেখে (যেমন, পুরো শব্দ হিসাবে), -w ব্যবহার করুন।
শ্মিক

1
আমার কি -q / --silentদরকার নেই? এটি ত্রুটিযুক্ত হয়ে গেলেও মিথ্যাভাবে "সমস্ত ভাল" বলে বাশ করতে বলে। আমি যদি এটি সঠিকভাবে পেয়েছি। এই মামলার জন্য একটি ত্রুটিযুক্ত ধারণা বলে মনে হচ্ছে।
redanimalwar

90

নিম্নলিখিত সমাধান সম্পর্কে:

grep -Fxq "$FILENAME" my_list.txt

আপনি যদি ভাবছেন (যেমন আমি করেছিলাম) তখন -Fxqসরল ইংরাজীতে কী বোঝায়:

  • F: PATTERN কীভাবে ব্যাখ্যা করা হয় তা প্রভাবিত করে (একটি রেজেক্সের পরিবর্তে স্থির স্ট্রিং)
  • x: পুরো লাইন মেলে
  • q: Shhhhh ... নূন্যতম মুদ্রণ

ম্যান ফাইল থেকে:

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

5
-এফ ফাইল প্রক্রিয়াজাতকরণকে প্রভাবিত করে না, এটি প্যাটার্ন কীভাবে ব্যাখ্যা করা হয় তা প্রভাবিত করে। সাধারণত, প্যাটার্নকে রিজেক্স হিসাবে ব্যাখ্যা করা হয়, তবে -F এর সাথে এটি একটি নির্দিষ্ট স্ট্রিং হিসাবে ব্যাখ্যা করা হবে।
অ্যাডাম এস

41

আমার মনে তিনটি পদ্ধতি:

1) কোনও পাথের নামের জন্য সংক্ষিপ্ত পরীক্ষা (আমি নিশ্চিত না যে এটি আপনার ক্ষেত্রে হতে পারে)

ls -a "path" | grep "name"


2) একটি ফাইলের স্ট্রিংয়ের জন্য সংক্ষিপ্ত পরীক্ষা

grep -R "string" "filepath"


3) রেজেেক্স ব্যবহার করে দীর্ঘ বাশ স্ক্রিপ্ট:

#!/bin/bash

declare file="content.txt"
declare regex="\s+string\s+"

declare file_content=$( cat "${file}" )
if [[ " $file_content " =~ $regex ]] # please note the space before and after the file content
    then
        echo "found"
    else
        echo "not found"
fi

exit

যদি আপনার কোনও লুপ ব্যবহার করে কোনও ফাইল সামগ্রীতে একাধিক স্ট্রিং পরীক্ষা করতে হয় তবে এটি দ্রুত হওয়া উচিত উদাহরণস্বরূপ যে কোনও সাইকেলের রেজেক্স পরিবর্তন করা।


10
$ File_contenet এর আগে এবং পরে কেন ফাঁকা স্থানগুলি প্রয়োজনীয়?
এমেনিজ আর্টাস

দ্রুত সমাধানের জন্য প্লাস 1 এবং আরও সাধারণকরণযোগ্য
ওয়াসাদামো

19

সহজ উপায়:

if grep "$filename" my_list.txt > /dev/null
then
   ... found
else
   ... not found
fi

টিপ: আপনি /dev/nullযদি কমান্ডের প্রস্থান স্থিতি চান তবে প্রেরণ করুন , তবে ফলাফলগুলি নয়।


1
বা ব্যবহার মতো -qযা --quiet:)
রজারডপ্যাক

-qএখানে সেরা উত্তরের সাথে একমত হন , এবং এটি চতুর্থ স্থানে রয়েছে। এই পৃথিবীতে কোন ন্যায়বিচার নেই।
তাতসু

14

সবচেয়ে সহজ এবং সহজ উপায় হ'ল:

isInFile=$(cat file.txt | grep -c "string")


if [ $isInFile -eq 0 ]; then
   #string not contained in file
else
   #string is in file at least once
fi

গ্রেপ-সি ফাইলটিতে স্ট্রিংটি কতবার ঘটে তার গণনা ফিরিয়ে দেবে।


5

যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনার যা প্রয়োজন তা করা উচিত।

  1. আপনি চেক ভেরিয়েবলের মাধ্যমে যে ডিরেক্টরিটি যুক্ত করতে চান তা নির্দিষ্ট করতে পারেন
  2. ডিরেক্টরি যদি ইতিমধ্যে তালিকায় থাকে তবে আউটপুটটি "দির ইতিমধ্যে তালিকাভুক্ত" থাকে
  3. ডিরেক্টরিটি এখনও তালিকায় না থাকলে এটি my_list.txt এ যুক্ত করা হয়

এক লাইনে :check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt


আপনাকে গ্রেপের আউটপুট পরীক্ষা করার দরকার নেই, থমাস তার উত্তরে যেভাবে grep -qসরাসরি গ্রেপ ব্যবহার করতে এবং কল করতে পারেন if। অধিকন্তু, তালিকায় ডিরেক্টরিটি যুক্ত করার আগে ডিরেক্টরিটি উপস্থিত রয়েছে কিনা তা প্রশ্নের মধ্যে অন্তর্ভুক্ত ছিল না (এটি সর্বোপরি মুছে ফেলা ডিরেক্টরিগুলির একটি তালিকা হতে পারে))
sorpigal

আমি উদাহরণের স্ক্রিপ্টটি সরিয়ে দিয়েছি, এটি থমাসের দেওয়া উত্তরে কিছু যোগ করেনি।
লেকোডসপর্টিফ

3

আপনি যদি কেবল একটি লাইনের অস্তিত্ব পরীক্ষা করতে চান তবে আপনার ফাইল তৈরি করার দরকার নেই। যেমন,

if grep -xq "LINE_TO_BE_MATCHED" FILE_TO_LOOK_IN ; then
  # code for if it exists
else
  # code for if it does not exist
fi  

3

আমার সংস্করণ fgrep ব্যবহার করে

  FOUND=`fgrep -c "FOUND" $VALIDATION_FILE`
  if [ $FOUND -eq 0 ]; then
    echo "Not able to find"
  else
    echo "able to find"     
  fi  

আমি -cবিকল্পটি দেখতে পাচ্ছি নাfgrep --help
নাম জি ভিউ

3
grep -E "(string)" /path/to/file || echo "no match found"

-E বিকল্পটি গ্রেপ ব্যবহারকে নিয়মিত এক্সপ্রেশন দেয়


1

@ থমাসের সমাধানটি কোনও কারণে আমার পক্ষে কার্যকর হয়নি তবে আমার বিশেষ অক্ষর এবং শ্বেত স্পেসগুলির সাথে দীর্ঘতর স্ট্রিং ছিল তাই আমি ঠিক এই জাতীয় পরামিতিগুলি পরিবর্তন করেছি:

if grep -Fxq 'string you want to find' "/path/to/file"; then
    echo "Found"
else
    echo "Not found"
fi

আশা করি এটি কাউকে সাহায্য করবে


0

একটি গ্রেপ-কম সমাধান, আমার জন্য কাজ করে:

MY_LIST=$( cat /path/to/my_list.txt )



if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
  echo "It's there!"
else
echo "its not there"
fi

ভিত্তিক: https://stackoverflow.com/a/229606/3306354


1
ফাইল বড় হওয়ার ক্ষেত্রে খুব বেশি মেমরি ব্যবহার করে। গৃহীত উত্তরেgrep -q বর্ণিত সর্বাধিক দক্ষ পন্থা।
কোডফোরস্টার

0
grep -Fxq "String to be found" | ls -a
  • গ্রেপ আপনাকে সামগ্রী চেক করতে সহায়তা করবে
  • ls সমস্ত ফাইল তালিকাবদ্ধ করবে

আমি মনে করি না lsস্ট্যান্ডার্ড ইনপুট গ্রহণ করে?
থম উইগার্স

@ থম উইগার্স আমি একই চেষ্টা করেছি এবং এটি আমার পক্ষে কাজ করেছে।
শিনয় শজি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.