একাধিক নিদর্শন গ্রেপ করতে xargs ব্যবহার করে


12

আমার কাছে এমন একটি ফাইল রয়েছে যার শর্তাবলী আমি গ্রেপ করতে চাই, প্রতিটি টার্মের সাথে ফাইলটিতে একটি লাইন থাকে। আমি ভাবছিলাম আমি xargs দিয়ে এটি করতে পারি। আমি এই জাতীয় পৃষ্ঠা থেকে উদাহরণ থেকে সংগ্রহ করতে সক্ষম কি

find ./work -print0 | xargs -0 rm

এটি কি xargs তার যুক্তির শেষে প্রাক পাইপ কমান্ডের আউটপুট সংযোজন করে। সুতরাং যদি অনুসন্ধানটি ফিরে আসে report.doc, তবে xargs নির্মাণ করবে rm report.doc। এই বোঝার কি সঠিক?

সুতরাং যেহেতু আমি চাইছি আমার ফাইলের মানগুলি গ্রেপ কমান্ডের মাঝখানে হয়, তাই আমার একটি স্থানধারক নির্দিষ্ট করা দরকার। চারপাশে খেলতে, আমি চেষ্টা করেছি {}, কিন্তু এটি কার্যকর হয়নি:

$> cat strings.txt | xargs grep {} subdirectory/*
grep: string1: No such file or directory
grep: string2: No such file or directory

Xargs সঠিক সরঞ্জাম? যদি তাই হয়, সিনট্যাক্স কি?

উত্তর:


17

হ্যাঁ, find ./work -print0 | xargs -0 rmএরকম কিছু কার্যকর করা হবে rm ./work/a "work/b c" ...। আপনি যাচাই করতে পারেন echo, find ./work -print0 | xargs -0 echo rmকার্যকর করা হবে এমন কমান্ডটি মুদ্রণ করবেন (সাদা স্থান বাদে যথাযথভাবে পালানো হবে, যদিও তা এটি প্রদর্শিত echoহবে না)।

পেতে xargsমাঝখানে নাম করা জন্য, আপনাকে যোগ করতে হবে -I[string], যেখানে [string]আপনি এই ক্ষেত্রে আপনি ব্যবহার চাই এ, যুক্তি দ্বারা প্রতিস্থাপন করা করতে চান -I{}, যেমন <strings.txt xargs -I{} grep {} directory/*

আপনি আসলে যা ব্যবহার করতে চান তা হ'ল grep -F -f strings.txt:

-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.)
-f FILE, --file=FILE
  Obtain  patterns  from  FILE,  one  per  line.   The  empty file
  contains zero patterns, and therefore matches nothing.   (-f  is
  specified by POSIX.)

সুতরাং grep -Ff strings.txt subdirectory/*যে কোন স্ট্রিং এর সব ঘটনার পাবেন strings.txtএকটি আক্ষরিক হিসাবে, আপনি ড্রপ যদি -Fবিকল্পটি ফাইলে রেগুলার এক্সপ্রেশনের ব্যবহার করতে পারেন। আপনি আসলে ব্যবহার করতে grep -F "$(<strings.txt)" directory/*পারে। আপনি যদি অনুশীলন করতে চান তবে আপনি findসারাংশে শেষ দুটি উদাহরণ ব্যবহার করতে পারেন। আপনি যদি কেবল প্রথম স্তরের পরিবর্তে পুনরাবৃত্তি অনুসন্ধান করতে চান তবে সংক্ষিপ্তসারেও আপনার কয়েকটি বিকল্প রয়েছে।

সারসংক্ষেপ:

# grep for each string individually.
<strings.txt xargs -I{} grep {} directory/*

# grep once for everything
grep -Ff strings.txt subdirectory/*
grep -F "$(<strings.txt)" directory/*

# Same, using file
find subdirectory -maxdepth 1 -type f -exec grep -Ff strings.txt {} +
find subdirectory -maxdepth 1 -type f -print0 | xargs -0 grep -Ff strings.txt

# Recursively
grep -rFf strings.txt subdirectory
find subdirectory -type f -exec grep -Ff strings.txt {} +
find subdirectory -type f -print0 | xargs -0 grep -Ff strings.txt

আপনি -lযদি সত্যিকারের লাইনটি দেখতে না চান তবে প্রতিটি মিলে যাওয়া ফাইলটির নাম পেতে বিকল্পটি ব্যবহার করতে পারেন :

-l, --files-with-matches
  Suppress  normal  output;  instead  print the name of each input
  file from which output would normally have  been  printed.   The
  scanning  will  stop  on  the  first match.  (-l is specified by
  POSIX.)

4

xargsfgrepআপনার ফাইল-অফ-স্ট্রিং-টু-ম্যাচে কেবল স্ট্রিং রয়েছে, নিয়মিত প্রকাশ নেই তবে আমি সেরা পরামর্শ নাও দিতে পারি ।

fgrep -f strings.txt subdirectory/*

আমি fgreptraditionalতিহ্যবাহী ইউনিক্স হিসাবে পরামর্শ দিচ্ছি grepএবং egrep"-f" বিকল্পটি নেই। আমি বিশ্বাস করি যে জিএনইউ grepএবং egrep"-f" বিকল্পটি রয়েছে, সুতরাং আপনার ফাইলটিতে যদি নিয়মিত এক্সপ্রেশন থাকে তবে আপনি একটি জিএনইউ সংস্করণ ব্যবহার করতে চান।

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