গ্রেপ বনাম awk ব্যবহার করা


17

একটি নির্দিষ্ট প্যাটার্ন ক্যাপচার, awkএবং grepব্যবহার করা যেতে পারে। আমরা কেন একে অপরকে ব্যবহার করব? কোনটি দ্রুত এবং কেন?

আমার যদি লগ ফাইল থাকে এবং আমি একটি নির্দিষ্ট প্যাটার্ন ধরতে চাইতাম, আমি নিম্নলিখিতগুলির মধ্যে একটি করতে পারি

awk '/pattern/' /var/log/messages

অথবা

grep 'pattern' /var/log/messages

আমি কোনও বেঞ্চমার্কিং করিনি, তাই আমি জানতাম না। কেউ কি এই বিস্তারিত বলতে পারেন? এই দুটি সরঞ্জামের অভ্যন্তরীণ কাজগুলি জেনে রাখা দুর্দান্ত।


যে কোনও কমান্ড, এমনকি শেল স্ক্রিপ্টগুলির পূর্বে timeকমান্ডটি চালাতে কতক্ষণ সময় লাগে তার কমান্ড সহ উদা: time ls -l
বুল্রিশ

উত্তর:


26

গ্রেপ সম্ভবত দ্রুততর হবে:

# time awk '/USAGE/' imapd.log.1 | wc -l
73832

real    0m2.756s
user    0m2.740s
sys     0m0.020s

# time grep 'USAGE' imapd.log.1 | wc -l
73832

real    0m0.110s
user    0m0.100s
sys     0m0.030s

awk হ'ল একটি ব্যাখ্যাযুক্ত প্রোগ্রামিং ল্যাঙ্গুয়েজ, যেখানে গ্রেপ হিসাবে একটি সংকলিত সি-কোড প্রোগ্রাম (যা অতিরিক্তভাবে ফাইলগুলিতে নিদর্শনগুলি অনুসন্ধানের দিকে অনুকূলিত করা হয়)।

(দ্রষ্টব্য - আমি উভয় কমান্ড দু'বার চালিয়েছি যাতে ক্যাশেগুলি সম্ভাব্যরূপে ফলাফলগুলি আঁকায় না)

উইকিপিডিয়ায় ব্যাখৃত ভাষা সম্পর্কে আরও বিশদ ।

স্টিফেন যেমন মন্তব্যগুলিতে যথাযথভাবে নির্দেশ করেছেন, আপনার মাইলেজটি আপনার ব্যবহার করা গ্রেপ এবং অ্যাডকে বাস্তবায়িত করার কারণে, এটি অপারেটিং সিস্টেমটি চালু রয়েছে এবং আপনি যে চরিত্র সেটটি প্রক্রিয়া করছেন তা পরিবর্তিত হতে পারে।


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

1
দ্বিতীয় কমান্ডটি সদ্য ক্যাশেড সংস্করণ ব্যবহার করবে। আমি সন্দেহ করি না যে গ্রেপ দ্রুততর তবে আপনার সংখ্যা যতটা দেখায় তেমনটি নয়।
এক্সউসাম

(অতএব দৌড়, গ্রেপ, ওড়ক, গ্রেপ এবং আর্ক এবং গ্রেপের দ্বিতীয় সেট থেকে ফলাফল পোস্ট করা :) এবং এফওয়াইআই, আমি একটি ইউটিএফ 8 লোকালে থাকি।
ড্রভ স্লোয়ান

1
বিএসডি সরঞ্জামগুলি (একটি ম্যাকের সাথে), খুব ভাল মজার, অভ (31.74 এস) সেড (33.34 এস) এর চেয়ে কিছুটা দ্রুত, যা গ্রেপ (34.21 এস) থেকে কিছুটা দ্রুত। Gnu awk 5.24 সেগুলিতে এগুলির সকলের মালিক, আমার কাছে gnu গ্রেপ বা পরীক্ষার জন্য সেড নেই।
কেভিন

1
গ্রেপটি কিছুটা দ্রুত হওয়া উচিত কারণ এডাব্লিক প্রতিটি ইনপুট লাইনের সাথে কেবলমাত্র রেজিপ্স্পের অনুসন্ধানের চেয়ে আরও বেশি কিছু করে, উদাহরণস্বরূপ যদি কোনও স্ক্রিপ্টে কোনও ক্ষেত্র উল্লেখ করা হয় (যা এটি এই ক্ষেত্রে নয়) খালি প্রতিটি ইনপুট লাইনকে ক্ষেত্রগুলিতে বিভক্ত করবে ক্ষেত্র-বিভাজক মান এবং এটি বিল্টিন ভেরিয়েবলকে পপুলেট করে। তবে আপনি যা পোস্ট করেছেন তাতে প্রায় কোনও পার্থক্য থাকতে হবে না। দ্বারা পর্যন্ত , grep এবং awk wrt ম্যাচিং regexps মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য একটি মানানসই স্ট্রিং এর জন্য যে, grep অনুসন্ধানসমূহ পুরো লাইন awk নির্দিষ্ট ক্ষেত্র অনুসন্ধান করতে পারেন এবং যাতে আরও বেশি স্পষ্টতা এবং কম মিথ্যা ম্যাচ প্রদান যখন হয়।
এড মর্টন

14

সর্বাধিক নির্দিষ্ট এবং অভিব্যক্তিপূর্ণ সরঞ্জামটি ব্যবহার করুন Use যে সরঞ্জামটি আপনার ব্যবহারের ক্ষেত্রে সবচেয়ে ভাল ফিট করে তা সম্ভবত দ্রুততম হতে পারে।

রুক্ষ গাইড হিসাবে:

  • একটি স্ট্রিং বা রিজেক্সের সাথে মিলে যাওয়া লাইনগুলি অনুসন্ধান করছেন? গ্রেপ ব্যবহার করুন।
  • একটি সহজ-বিস্মৃত ফাইল থেকে নির্দিষ্ট কলামগুলি নির্বাচন করছেন? কাটা ব্যবহার করুন।
  • প্যাটার্ন-ভিত্তিক বিকল্পগুলি সম্পাদন করা বা ... অন্যান্য স্টাফগুলি যুক্তিসঙ্গতভাবে করতে পারে? সেড ব্যবহার করুন।
  • উপরের 3, বা প্রিন্টফ ফর্ম্যাটিং, বা সাধারণ উদ্দেশ্য লুপ এবং শাখাগুলির কয়েকটি সমন্বয় প্রয়োজন? অজানা ব্যবহার করুন।

perlপরিবর্তে ব্যবহার বাদে +1 awk। আপনার যদি গ্রেপ / কাট / সেডের চেয়ে আরও জটিল কিছু দরকার হয় তবে সম্ভাবনাগুলি পুরোপুরি যথেষ্ট হবে না এবং আপনার "ফুল-
ব্লোন্ড

@ এসএসএস এর পরিবর্তে অজগর নয় কেন
রেট্রো কোড

@ রেট্রোড: পাইথন পার্লের চেয়ে বেশি "সাধারণ উদ্দেশ্য"; সমতুল্য এক-লাইনারটি সম্ভবত দীর্ঘতর হবে।
sd

3
@ এসডিএস না, আপনি পাঠ্য প্রক্রিয়াজাতকরণ ব্যতীত অন্য কিছু করতে না পারলে আপনার পার্লের দরকার নেই। গ্রেড / কাট / সেডের চেয়ে জটিল এবং টেক্সট প্রসেসিং স্টাফের জন্য অ্যাডাব্লিক ঠিক ঠিক আছে এবং পার্লের বিপরীতে সমস্ত ইউনিক্স ইনস্টলেশনে বোনাস স্ট্যান্ডার্ড হিসাবে আসে।
এড মর্টন

10

যখন কেবল স্ট্রিংগুলি এবং গতির বিষয়গুলি অনুসন্ধান করা হয় তখন আপনার প্রায় সবসময় ব্যবহার করা উচিত grep। এটি awkকেবলমাত্র স্থূল অনুসন্ধানের চেয়ে দ্রুততার অর্ডার ।

উত্স সেড, অজক এবং অন্যান্য ইউনিক্স পার্সিং ইউটিলিটির কার্যকরী ও কার্যকারিতা পার্থক্য

UTILITY    OPERATION TYPE      EXECUTION TIME     CHARACTERS PROCESSED PER SECOND
                               (10 ITERATIONS)
-------    --------------      ---------------    -------------------------------
grep       search only         41 sec.            489.3 million
sed        search & replace    4 min. 4 sec.      82.1 million
awk        search & replace    4 min. 46 sec.     69.8 million
Python     search & replace    4 min. 50 sec.     69.0 million
PHP        search & replace    15 min. 44 sec.    21.2 million

1
এই সমস্ত প্রোগ্রামের এই সুন্দর ওভারভিউ জন্য ধন্যবাদ। এটি সত্যই অন্ধকারে আলো ফেলে।
holasz

1
~ হেডটিল্ট ~ পিএইচপি চালু আছে কিন্তু পার্ল নেই?
ইজকাটা

@ ইজকাটা - আমি যখন এই টেবিলটি কিছুক্ষণ আগে দেখেছি তখন একই জিনিসটি ভেবেছিলাম।
slm

1
এটি অন্যান্য ব্যবহারগুলির পক্ষে সত্যিই ন্যায্য নয় যে গ্রেপ কেবল অনুসন্ধান করছে এবং সেগুলি প্রতিস্থাপনও করছে।
কেভিন

1
সেগুলি সম্পূর্ণ বোগাস নম্বর numbers আপেল এবং কমলার তুলনা করার বিষয়ে কথা বলুন - এটি বলার মতো যে আপনি কেবলমাত্র 5 সেকেন্ডে ওয়েব সাইট এ-তে একটি নতুন গাড়ি খুঁজে পাবেন যেখানে আপনি গাড়ি খুঁজে পেতে পারেন, দাম নিয়ে আলোচনা করতে পারেন, loanণ নিতে পারেন এবং 1 ঘন্টার মধ্যে বি বিতে গাড়িটি কিনতে পারবেন অতএব সাইটের একটি দ্রুততর তুলনায় সাইটের B.The নিবন্ধটি আপনাকে উদ্ধৃত হয় এটা, grep মধ্যে আপেক্ষিক সঞ্চালনের গতি, কিন্তু, এবং awk বিবৃতি সম্পূর্ণভাবে ভুল এবং এটি বলছেন awk ... has PCRE matching for regular expressionsযা ঠিক, সম্পূর্ণ অসত্য।
এড মর্টন

5

যদিও আমি সম্মত হচ্ছি যে তত্ত্বের ক্ষেত্রে বাস্তবে, ওয়াইএমএমভি এর grepচেয়ে দ্রুত হওয়া উচিত awkযা আপনার ব্যবহারের প্রয়োগের উপর অনেক বেশি নির্ভর করে।

এখানে ব্যস্তবক্স ১.২০.০ এর গ্রেপ এবং ওজেড, জিএনইউ গ্রেপ ২.১৪, মাক 1.৩.৩, জিএনইউ অ্যাডকিউ ৪.০.১ এর ২.০ এমবি লাইনের একটি ২৪০ এমবি ফাইলে একটি ইউটিএফ-8 লোকালে একটি দেউবিয়ান / লিনাক্স .0.০ এএমডি (৪ (গ্লিবিসি ২.১ with সহ) কেবলমাত্র ASCII অক্ষর।

$ time busybox grep error error | wc -l
331003
busybox grep error error  8.31s user 0.12s system 99% cpu 8.450 total
wc -l  0.07s user 0.11s system 2% cpu 8.448 total
$ time  busybox awk /error/ error | wc -l
331003
busybox awk /error/ error  2.39s user 0.84s system 98% cpu 3.265 total
wc -l  0.12s user 1.23s system 41% cpu 3.264 total
$ time  grep error error | wc -l
331003
grep error error  0.80s user 0.10s system 99% cpu 0.914 total
wc -l  0.00s user 0.11s system 12% cpu 0.913 total
$ time mawk /error/ error | wc -l
330803
mawk /error/ error  0.54s user 0.13s system 91% cpu 0.732 total
wc -l  0.03s user 0.08s system 14% cpu 0.731 total
$ time gawk /error/ error | wc -l
331003
gawk /error/ error  1.37s user 0.12s system 99% cpu 1.494 total
wc -l  0.04s user 0.07s system 7% cpu 1.492 total
$ time 

সি লোকালে, কেবল জিএনইউ গ্রেপই একটি উল্লেখযোগ্য উত্সাহ পায় এবং তার চেয়ে দ্রুততর হয় mawk

ডেটাসেট, রেজিপ্সপের ধরণটিও একটি বড় পার্থক্য করতে পারে। Regexps জন্য, এর regexps প্রসারিত REs হিসাবে awkতুলনা করা উচিত ।grep -Eawk

এই ডেটাসেটের জন্য, ব্যস্তবক্স ভিত্তিক সিস্টেম বা সিস্টেমগুলির awkতুলনায় দ্রুততর হতে পারে grepযেখানে mawkডিফল্ট awkএবং ডিফল্ট লোকেলটি ইউটিএফ -8 ভিত্তিক (আইআইআরসি, এটি উবুন্টুতে ব্যবহৃত হত)।


2

সংক্ষেপে, grepঅন্য অনেকগুলি ইউনিক্স সরঞ্জাম হিসাবে কেবল একটি কাজ করে এবং এটি প্রদত্ত প্যাটার্নের সাথে একটি লাইনের সাথে মিলে যায় এবং এটি এটি ভাল করে তোলে। অন্যদিকে, awkএটি আরও পরিশীলিত সরঞ্জাম কারণ এটি প্যাসিক্স স্ট্যান্ডার্ড দ্বারা ভেরিয়েবল, অ্যারে, এক্সপ্রেশন, ফাংশন বা প্যাটার্ন স্ক্যানিং এবং প্রক্রিয়াজাতকরণের জন্য নিয়ন্ত্রণ বিবৃতিগুলির মতো বৈশিষ্ট্যযুক্ত বৈশিষ্ট্যযুক্ত একটি সম্পূর্ণ প্রোগ্রামিং ভাষা।

আমার মতে, এটি প্যাটার্ন মেলানোর ক্ষেত্রে এবং কীভাবে আপনি প্রক্রিয়া করতে চান তার কিছু আকারের আকারে উভয় সরঞ্জাম কীভাবে সম্পাদন করে তা বাস্তবায়নের উপর নির্ভর করে। আমি আশা করব যে গ্রেপ সাধারণত অ্যাডকের চেয়ে বেশি কার্যকর কারণ এটি কেবল মিলছে matching তবে আপনি অন্যান্য সরঞ্জামগুলি ব্যবহার না করে ম্যাচ করা রেকর্ডস, গণনা বা মুদ্রণ ফলাফলের আরও প্রক্রিয়াজাতকরণের মতো আরও জটিল কাজগুলি সম্পাদন করার জন্য গ্রেপ দিয়ে একটি সহজ কোড লিখতে পারবেন না।

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