কখন আমাকে ইনপুট পুনঃনির্দেশ ব্যবহার করা উচিত?


21

একই ফলাফল তৈরি করতে আমি নিম্নলিখিত দুটি কমান্ড ব্যবহার করেছি: -

[root@localhost ~]# grep line comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#

[root@localhost ~]# grep line <comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#

এই 2 টি একে অপরের সাথে যোগাযোগ করা যদি কোনও দয়া করে আমাকে কোনও মতামত / কনস ব্যাখ্যা করতে পারেন?

উত্তর:


28

man grepপৃষ্ঠাটি থেকে (ডেবিয়ানে):

বর্ণনা

   grep  searches the named input FILEs (or standard input if no files are
   named, or if a single hyphen-minus (-) is given as file name) for lines
   containing  a  match to the given PATTERN.  By default, grep prints the
   matching lines.

প্রথম ক্ষেত্রে, grepফাইলটি খোলে; দ্বিতীয়টিতে, শেলটি ফাইলটি খোলে এবং এর স্ট্যান্ডার্ড ইনপুটকে নির্ধারিত করে grep, এবং grepকোনও ফাইল নাম যুক্তি পাস না করে ধরে নেওয়া হয় যে এটির স্ট্যান্ডার্ড ইনপুটটি গ্রেপ করা দরকার।

1 এর পেশাদার:

  • grep একাধিক ফাইল গ্রেপ করতে পারে¹
  • grepফাইলের নাম প্রদর্শন করতে পারে যেখানে প্রতিটি ঘটনা lineখুঁজে পাওয়া যায়।

2 এর পেশাদার:

  • যদি ফাইলটি খোলা না যায়, শেলটি একটি ত্রুটি ফেরায় যা আরও প্রাসঙ্গিক তথ্য (যেমন স্ক্রিপ্টের লাইন নম্বর) এবং আরও সুসংগত উপায়ে (যদি আপনি শেলটিকে অন্য কমান্ডের জন্য ফাইলগুলিও খুলতে দেয়) এর চেয়ে বেশি থাকে grepএটি খোলে এবং যদি ফাইলটি খুলতে না পারে, grepএমনকি তাকে বলা হয় না (যা কিছু আদেশের জন্য - সম্ভবত না grep- এটি একটি বড় পার্থক্য আনতে পারে )।
  • ইন grep line < in > out, যদি inনা খোলা যায় outতবে তৈরি করা হবে না বা কেটে যাবে।
  • অস্বাভাবিক নাম (যেমন -বা ফাইলের নাম দিয়ে শুরু হওয়া -) with দিয়ে কিছু ফাইল নিয়ে কোনও সমস্যা নেই ²
  • প্রসাধনী: আপনি <fileকমান্ড-লাইনে আরও স্বাভাবিকভাবে কমান্ড প্রবাহকে আরও স্বাভাবিকভাবে দেখানোর জন্য রাখতে <in grep line >outপারেন, আপনি যদি পছন্দ করেন তবে prefer
  • প্রসাধনী: GNU এর সাহায্যে grep, কেবল ফাইলের নামের পরিবর্তে ম্যাচের লাইনের সামনে কী লেবেলটি ব্যবহার করতে হবে তা চয়ন করতে পারেন:

    <file grep --label='Found in file at line' -Hn line
    

পারফরম্যান্সের ক্ষেত্রে, ফাইলটি যদি না খোলতে পারে তবে আপনি grepপুনর্নির্দেশটি ব্যবহার করার সময় সম্পাদনটি সংরক্ষণ করেন , তবে অন্যথায় grepআমি খুব বেশি পার্থক্য আশা করি না।

পুনঃনির্দেশের সাহায্যে, আপনি অতিরিক্ত তর্কটি পাস করতে বাঁচান grep, আপনি grepযুক্তিটি কিছুটা সহজ করে ফেলছেন। অন্যদিকে, শেলটির dup2()জন্য ফাইল বর্ণনাকারী 0-তে ফাইল বর্ণনাকারীতে একটি অতিরিক্ত সিস্টেম কল প্রয়োজন (কমপক্ষে) ।

ইন { grep -m1 line; next command; } < file, grep(এখানে জিএনইউ grep) seek()মেলানো লাইনের ঠিক পরে ফিরে যেতে চাইবে যাতে next commandফাইলটি বাকী দেখায় (ফাইলটি সন্ধানযোগ্য কিনা তাও এটি নির্ধারণ করতে হবে)। অন্য কথায়, স্টিডিনের মধ্যে অবস্থান হ'ল আউটপুটগুলির মধ্যে একটি grep। এর সাথে grep -m1 line fileএটি এটিকে অপ্টিমাইজ করতে পারে, এটি grepযত্ন নেওয়ার জন্য কম কাজ ।


নোট

¹ এর সাথে zsh, আপনি এটি করতে পারেন:

grep line < file1 < file2

তবে এটি cat file1 file2 | grep line( catইউটিলিটিটি না জানিয়ে ) সমপরিমাণটি করছে এবং তাই কম দক্ষ, যদি প্রথম ফাইলটি একটি নতুন লাইন চরিত্রের মধ্যে শেষ না হয় এবং কোন ফাইলটিতে প্যাটার্নটি পাওয়া যায় তা আপনাকে অবহিত করতে না পারে সেজন্য বিভ্রান্তি সৃষ্টি করতে পারে।

² এর ক্ষেত্রে ksh93এবং bashযদিও, মত ফাইল /dev/tcp/host/port(এবং /dev/fd/xকিছু সিস্টেমে bash) যা, যখন পুনঃনির্দেশগুলি লক্ষ্য ব্যবহৃত পরিবর্তে সত্যিই ফাইল সিস্টেমে ফাইল খোলার বিশেষ উদ্দেশ্যের জন্য শেল বিবৃতি (যদিও সাধারণত, ঐ ফাইল ফাইল সিস্টেমে উপস্থিত নেই)। স্বীকৃত /dev/stdinহিসাবে একই উদ্দেশ্যে কাজ -করে grep, তবে কমপক্ষে, এখানে এটি আরও সঠিকভাবে নাম স্পেস ( -যেকোনও ডিরেক্টরিতে ডাকা একটি ফাইল তৈরি করতে পারে , যখন কেবল প্রশাসকরা একটি ফাইল নামক ফাইল তৈরি করতে পারে /dev/tcp/host/portএবং প্রশাসকদের আরও ভাল জানা উচিত)।


+1, সুন্দর ব্যাখ্যার জন্য। আমার একটি সন্দেহ আছে: ২ য় ক্ষেত্রে শেল ফাইলটি খোলার পরে কি এটি খোলা ফাইলের সামগ্রীগুলি স্ট্যান্ডার্ড ইনপুট (কীবোর্ড) এ দেয় না ?? (আমি 'গ্রেপের মানক ইনপুট' শব্দটি নিয়ে বিভ্রান্ত হয়েছি))
— অঙ্কিত

1
@ অঙ্কিত, স্টিডিন যেখানে অ্যাপ্লিকেশনগুলি তাদের ইনপুটটি ডিফল্টরূপে পড়বে, ফাইল বর্ণনাকারী 0। যখন টার্মিনালে থাকে, তখন fd 0 টার্মিনাল ডিভাইসে (/ dev / ttyxx বা / dev / pts / n এর মতো কিছু) পড়া থেকে খোলা হয়। আপনি কীবোর্ডে যা টাইপ করেন তা পেয়ে তারা শেষ করে। কমান্ডের স্টিডিনের শেল পুনঃনির্দেশ কমান্ডটি কার্যকর করার পূর্বে fd 0 কে অন্য কোনও ফাইলে খোলে।
— স্টাফেন চেজেলাস

6

স্টিফেনচাজলাসের উত্তরগুলি কভার করে grep(1)এবং বেশিরভাগ ইউনিক্স বংশের কমান্ডগুলি সেভাবে কাজ করে তবে সমস্ত কিছুই নয়। স্ট্যান্ডার্ড ইনপুট (কীবোর্ড থেকে < file, পুনর্নির্দেশিত কোনও ফাইল থেকে , বা অন্য কমান্ড দ্বারা পাইপযুক্ত আউটপুট থেকে, বোকামির উদাহরণ থেকে ls * | grep '^ab*c$'), বা আর্গুমেন্ট হিসাবে দেওয়া ফাইল (গুলি) থেকে পড়ার জন্য এটি আদর্শ grep comment file1 file2 file3। কিছু কমান্ড সেখানে কনভেনশন ব্যবহার করে যে নামকৃত ফাইলটি -স্ট্যান্ডার্ড ইনপুট, তাই আপনি যা কিছু উত্পন্ন করে তারপরে make-middle | cat head - tailস্ট্রিম পেতে বলতে পারেন । কমান্ডগুলির ব্যবহারে নমনীয়তা দেওয়ার জন্য এটি নকশা দ্বারা।headgen-middletail

কোনটা ভাল? যতক্ষণ এটি কাজ করে, cmd fileতার চেয়ে কম হয় cmd < file; সেখানে একটি হতে পারে অতি ক্ষুদ্র শেল (ফাইল frobbing করছেন মধ্যে সময় পার্থক্য <) এবং কমান্ড নিজে এরকম, কিন্তু সম্ভবত কেউ খেয়াল করে না, যদি না আপনি দীর্ঘ সারাদিন অন্য কিছুই না। এটি স্টিফেনের উত্তরে উল্লিখিত উপকারের মতো বিবেচনার উপর নির্ভর করবে।


cmd filecmd<fileযদিও কম হয় না ।
— স্টাফেন চেজেলাস

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