awk, sed, এবং grep — এই তিনটি হচ্ছে লিনাক্স বা UNIX কমান্ড লাইনের আমার প্রিয় টুলগুলো। তিনটিই খুব পাওয়ারফুল। আজ আমরা awk-র সাথে কিভাবে শুরু করবেন সেটা দেখব যাতে আপনি সহজে ব্যবহার করতে পারেন। তারপর কিছু উপযোগী awk वन-লাইনার দেখব যাতে কঠিন শেখা একটু মজাদার হয়।
AWK হলো একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ যা টেক্সট-বেসড ডেটা প্রসেস করার জন্য ডিজাইন করা হয়েছে, चाहে ফাইলে থাকে বা ডেটা স্ট্রিমে। এটি ১৯৭০-এর দশকে Bell Labs-এ তৈরি হয়েছিল। যদিও এটি পুরনো, এর বয়সের জন্য ফাঁস না খান। এটি যা করে তার জন্য অত্যন্ত পাওয়ারফুল এবং ইফিশিয়েন্ট। চলুন হাত গরাম করি।
awk-এর জটিল ওয়ার্কিং এবং ব্যবহারে যাওয়ার আগে বেসিক্স থেকে শুরু করি। আমরা এই এক্সারসাইজের জন্য একটি ডামি ফাইল তৈরি ও ব্যবহার করব। আপনি যেকোনো টেক্সট ফাইল ব্যবহার করতে পারেন, যেমন আপনার সিস্টেমের একটি লগ। আমার পছন্দের সিস্টেম মনিটরিং টুল Dstat-এর একটি স্যাম্পল আউটপুট ব্যবহার করছি। আউটপুটটি নিচে:

বড় করার জন্য ক্লিক করুন
এটি awk হ্যান্ডেল করার জন্য একটি আদর্শ আউটপুট। awk কমা বা ট্যাব সেপারেটেড কনটেন্টের সাথে খুব ভালো কাজ করে। শীঘ্রই বুঝতে পারবেন কেন। তাই অনুরূপ ডেটা তৈরি করুন বা উপরের উদাহরণটি কপি-পেস্ট করুন একটি ডামি ফাইলে যেন test.txt। আপনার লিনাক্স কম্পিউটারে একটি টার্মিনাল উইন্ডো লঞ্চ করুন। প্রায় সব লিনাক্স ফ্লেভার awk সাথে আসে। যদি কোনো কারণে না থাকে, তবে ইন্সটল করুন। টার্মিনাল উইন্ডোতে test.txt ফাইলটি যেখানে সংরক্ষিত সেই ডিরেক্টরি থেকে নিচের কমান্ডটি টাইপ করুন —
# awk {'print'} test.txt
আউটপুটে টেক্সট ফাইলের সম্পূর্ণ কন্টেন্ট থাকবে। এতে কী মজা।
এখন দেখি কিভাবে একটি কলাম পিক করে শুধু সেটা প্রিন্ট করবেন। নিচের কমান্ড এক্সিকিউট করুন:
# awk {'print $1'} test.txt
এখন আমরা awk-কে বলছি টেক্সট ফাইলের শুধু প্রথম কলাম প্রিন্ট করতে। এটি অটোমেটিক্যালি বুঝবে যে ফাইলটি ট্যাব-সেপারেটেড এবং কন্টেন্টের শুধু প্রথম কলাম প্রিন্ট করবে। আউটপুটে আপনি কিছু এইরকম দেখবেন:
—-total-cpu-usage—-
usr
5
13
8
0
1
1
1
0
1
1
আপনি যেকোনো কলামের জন্য একই কাজ করতে পারেন। আপনি যদি তৃতীয় কলাম প্রিন্ট করতে চান, উপরের কমান্ডকে পরিবর্তন করুন:
# awk {'print $3'} test.txt
আপনি একসাথে একাধিক কলামও প্রিন্ট করতে পারেন। যদি প্রথম, তৃতীয় এবং সপ্তম কলাম প্রিন্ট করতে চান, কমান্ডে কামা দিয়ে সেগুলো যোগ করুন।
# awk {'print $1, $3, $7'} test.txt
এটি আপনার জন্য কাজ করবে:
—-total-cpu-usage—- -net/total-
usr idl read
5 93 154k
13 87 0
8 92 0
0 99 0
1 97 0
1 98 0
1 99 0
0 99 0
1 99 0
1 100 0
আপনার যদি /etc/password ফাইলের মতো একটি ট্রিকি ফাইল থাকে যেখানে ডেটা স্পেস বা ট্যাবের বদলে কোলন দিয়ে সেপারেটেড, awk সেটা অটোমেটিক্যালি পিক করে না। সেসব কেসে আপনি awk-কে সঠিক সেপারেটর খাওয়াতে পারেন। সেকেন্ড কলাম প্রিন্ট করার জন্য নিচের কমান্ড ব্যবহার করুন:
# awk -F':' {'print $1'} /etc/passwd
এই কমান্ড আপনার সিস্টেমের সব ইউজারের ইউজারনেমের আউটপুট দেবে:
apple
mango
banana
watermelon
kiwi
orange
আপনি যেকোনো টাইপের সেপারেটরের সাথে একই কাজ করতে পারেন। আপনি awk ব্যবহার করে আপনার লগ ফাইলও পার্স করতে পারেন। উদাহরণস্বরূপ, আপনি যদি আপনার ওয়েব সার্ভারের অ্যাক্সেস লগ পার্স করে সব IP অ্যাড্রেস এবং রিলেটেড ওয়েব URL দেখতে চান যেগুলো অ্যাক্সেস হয়েছে, নিচের কমান্ড ব্যবহার করুন:
# awk '$9 == 200 { print $1, $7}' access.log
199.63.142.250 /2008/10/my-5-favourite-hangouts/
220.180.94.221 /2009/02/querious-a-mysql-client-for-the-mac/
67.190.114.46 /2009/05/
173.234.43.110 /2009/01/bicycle-rental/
173.234.38.110 /wp-comments-post.php
এই টাইপের পার্সিং ব্যবহার করে আপনি বুঝতে পারেন কেউ আপনার ওয়েবসাইটে বারবার ভিজিট করছে কিনা, সে কি ইনফরমেশন চুরি করছে। আপনি এই ইনফোর্মেশন সর্টও করতে পারেন। ধরুন আপনি জানতে চান একটি নির্দিষ্ট IP অ্যাড্রেস কতবার আপনার ওয়েবসাইট ভিজিট করেছে:
# awk '$9 == 200 { print $1}' access.log | sort | uniq -c | sort -nr
46 122.248.161.1
35 122.248.161.2
26 65.202.21.10
24 67.195.111.46
19 144.36.231.111
18 59.183.121.71