sed
কমান্ড awk
কমান্ড এবং পিছনের সময়ের অপসারণের সমস্ত একটি একক awk কমান্ড একত্রিত করা যেতে পারে:
while read -r host; do dig +search "$host" ALL; done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'
বা যেমন একাধিক লাইনে ছড়িয়ে আছে:
while read -r host
do
dig +search "$host" ALL
done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'
কারণ awk
কমান্ডটি done
বিবৃতি অনুসরণ করে , কেবল একটি awk
প্রক্রিয়া শুরু করা হয়েছে। যদিও দক্ষতা এখানে গুরুত্বপূর্ণ নয়, এটি প্রতিটি লুপের সাথে একটি নতুন সেড বা অ্যাজক প্রক্রিয়া তৈরি করার চেয়ে বেশি দক্ষ।
উদাহরণ
এই পরীক্ষার ফাইল সহ:
$ cat hostlist.txt
www.google.com
fd-fp3.wg1.b.yahoo.com
কমান্ডটি উত্পাদন করে:
$ while read -r host; do dig +search "$host" ALL; done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'
www.google.com, 216.58.193.196
fd-fp3.wg1.b.yahoo.com, 206.190.36.45
কিভাবে এটা কাজ করে
awk স্পষ্টতই একবারে এর ইনপুট একটি রেকর্ড (লাইন) পড়ে। এই awk স্ক্রিপ্টটি একটি একক ভেরিয়েবল ব্যবহার করে f
, যা পূর্ববর্তী লাইনটি একটি উত্তর বিভাগের শিরোনাম ছিল কিনা তা নির্দেশ করে।
f{sub(/.$/,"",$1); print $1", "$NF; f=0}
পূর্ববর্তী লাইনটি যদি একটি উত্তর বিভাগের শিরোনাম ছিল তবে f
তা সত্য হবে এবং কোঁকড়ানো ধনুর্বন্ধনীতে কমান্ডগুলি কার্যকর করা হবে। প্রথমটি প্রথম ক্ষেত্র থেকে চলার সময়কাল সরিয়ে দেয়। দ্বিতীয়টি প্রথম ক্ষেত্র প্রিন্ট করে ,
, তার পরে এবং শেষ ক্ষেত্রটি অনুসরণ করে। তৃতীয় বিবৃতিটি f
শূন্য (মিথ্যা) এ পুনরায় সেট করে।
অন্য কথায়, f
এখানে একটি যৌক্তিক শর্ত হিসাবে কাজ করে। কোঁকড়া ধনুর্বন্ধনী মধ্যে কমান্ডগুলি কার্যকর করা হয় যদি f
এটি ননজারো হয় (যা অবাস্তে, এর অর্থ 'সত্য')।
/ANSWER SECTION/{f=1}
যদি বর্তমান লাইনে স্ট্রিং থাকে ANSWER SECTION
তবে ভেরিয়েবলটি (সত্য) এ f
সেট করা হয় 1
।
এখানে, /ANSWER SECTION/
একটি যৌক্তিক অবস্থা হিসাবে কাজ করে। বর্তমানের নিয়মিত অভিব্যক্তির সাথে মিল থাকলে এটি সত্য হিসাবে মূল্যায়ন করে ANSWER SECTION
। যদি এটি হয়, তবে কমান্ডটি কোঁকড়ানো ধনুর্বন্ধনীগুলিতে কার্যকর করা হয়েছে।
dig +short
আপনার জন্য কাজ করে না?