এই গাইডে দেখানো হয়েছে লিনাক্সে awk কমান্ড কিভাবে ব্যবহার করবেন, প্র্যাকটিক্যাল প্রতিদিনের উদাহরণসহ।
AWK হলো লিনাক্স অপারেটিং সিস্টেমের জন্য টেক্সট সার্চ ও ম্যানিপুলেশনের একটি টুল এবং ল্যাঙ্গুয়েজ।
awk কমান্ড এবং এসোসিয়েটেড স্ক্রিপ্টিং ল্যাঙ্গুয়েজ ফাইলগুলো থেকে pattern দিয়ে ডিফাইন করা টেক্সট সার্চ করে এবং ম্যাচ করা টেক্সটের ওপর নির্দিষ্ট action পারফর্ম করে।
awk বড় টেক্সট ফাইল বা বড় সংখ্যক টেক্সট ফাইল থেকে ডেটা এক্সট্র্যাক্ট করে রিপোর্ট বানাতে খুব উপযোগী - যেমন লগ প্রসেসিং, বা টেম্পারেচার প্রোব মতো ডেটা-রেকর্ডিং ডিভাইস যা lâu ধরে ডেটা সংগ্রহ করেছে। ডেটাবেস কোয়েরির আউটপুটেও ব্যবহার করা যায়।
awk ইনস্টল করার প্রয়োজন নেই; এটি আপনার লিনাক্স সিস্টেমে ইতিমধ্যে থাকা উচিত।
awk সিনট্যাক্স
টার্মিনালে awk কমান্ড ব্যবহারের সিনট্যাক্স:
awk [PROGRAM] [INPUT FILES]
নোট করুন:
- [PROGRAM] হলো সার্চ প্যাটার্ন এবং নেওয়া অ্যাকশন - এটি আপনি awk-কে সাপ্লাইড ফাইলগুলোর ওপর চালাতে চান
- একটি টেক্সট ফাইল হিসেবেও সাপ্লাই করা যায় -f অপশন ব্যবহার করে ইনলাইনের বদলে
- [INPUT FILES] হলো awk-কে কাজ করার জন্য ফাইলগুলো - একাধিক ফাইল স্পেস দিয়ে সেপারেট করে, বা ডিরেক্টরির পথ, বা ফাইল ম্যাচ করার প্যাটার্ন
- ইনপুট ফাইল স্পেসিফাই না করলে, awk অন্য কমান্ডের পাইপড আউটপুটের ওপর কাজ করবে
awk অপশন
awk কমান্ডে নিচের অপশনগুলো পাস করা যায়:
| -f program-file | প্রোগ্রাম টেক্সট ফাইল থেকে পড়া হবে কমান্ডলাইনের বদলে। একাধিক -f অপশন অ্যাকসেপ্টেড। |
| -F value | ফিল্ড সেপারেটর, FS, value-এ সেট করুন। |
| -v var=value | প্রোগ্রাম ভেরিয়েবল var-এ value অ্যাসাইন করুন। |
আপনার awk ভার্সন-স্পেসিফিক আরও অপশনের জন্য ম্যানুয়াল চেক করুন:
man awk
প্রোগ্রাম অ্যাকশন ও ভেরিয়েবল
awk-এ আপনি যে প্রোগ্রাম সাপ্লাই করবেন সেটা নির্ধারণ করবে এটি আপনার সাপ্লাইড টেক্সট ফাইলগুলোর সাথে কী করবে। এক awk প্রোগ্রাম নিচের ফরম্যাটে থাকে:
CONDITION { ACTION } CONDITION { ACTION } ... এখানে CONDITION হলো ম্যাচ করানো টেক্সট প্যাটার্ন এবং ACTION হলো ম্যাচ করা টেক্সটের ওপর নেওয়া অ্যাকশন। আপনি যত চাইতে কন্ডিশন এবং অ্যাকশন रखতে পারেন।
অ্যাকশনস
সাপ্লাইড অ্যাকশনগুলো কমান্ড যাতে ক্যালকুলেশন, ভেরিয়েবল, এবং ফাংশন কল অন্তর্ভুক্ত করতে পারে। কিছু বিল্ট-ইন ফাংশন ইমপ্লিমেন্টেশন-স্পেসিফিক, তাই সেগুলোর জন্য ম্যানুয়াল চেক করুন।
রেকর্ডস
awk সাধারণত টেক্সট ফাইলে প্রতিটি নতুন লাইনে একটি রেকর্ড ধরে, অন্যথায় OPTIONS দিয়ে স্পেসিফাই করা থাকলে।
ফিল্ডস
awk হোয়াইটস্পেস (স্পেস, ট্যাব) দিয়ে রেকর্ড-এ ফিল্ড ডিনোট করে, অন্যথায় OPTIONS দিয়ে স্পেসিফাই করা থাকলে।
ভেরিয়েবলস
awk-এর অনেক বিল্ট-ইন ভেরিয়েবল আছে যা আপনি নিজে ডিফাইন না করেও ব্যবহার করতে পারেন, যেগুলো কিছু সাধারণ সিনারিও কভার করে:
| ভেরিয়েবল | অর্থ |
|---|---|
| $0 | পুরো রেকর্ড রিপ্রেজেন্ট করে |
| $1, $2, $3 … | ফিল্ড ভেরিয়েবল - রেকর্ডের ইনডিভিজুয়াল টেক্সট ফিল্ডের টেক্সট/ভ্যালু ধারণ করে |
| NR / Number of Records | সকল ফাইল থেকে এতক্ষণে পড়া ইনপুট রেকর্ডের বর্তমান কাউন্ট |
| FNR / File Number of Records | কারেন্ট ফাইলে এতক্ষণে পড়া ইনপুট রেকর্ডের বর্তমান কাউন্ট - নতুন ফাইল শুরু হলে অটোমেটিক্যালি শূন্যে রিসেট |
| NF / Number of Fields | কারেন্ট ইনপুট রেকর্ডে ফিল্ডের সংখ্যা - রেকর্ডের লাস্ট ফিল্ড $NF দিয়ে রেফারেন্স করা যায়, ২য় লাস্ট $(NF-1) দিয়ে, ইত্যাদি |
| FILENAME | কারেন্ট ইনপুট ফাইলের নাম |
| FS / Field Separator | রেকর্ডে ফিল্ড আলাদা করার ক্যারেক্টার(গুলো)। ডিফল্টে যেকোনো স্পেস এবং ট্যাব ক্যারেক্টার |
| RS / Record Separator | ফাইলে রেকর্ড আলাদা করার ক্যারেক্টার(গুলো)। ডিফল্টে নিউ লাইন |
| OFS / Output Field Separator | Awk আউটপুটে ফিল্ড আলাদা করার ক্যারেক্টার(গুলো)। ডিফল্টে সিঙ্গেল স্পেস |
| ORS / Output Record Separator | Awk আউটপুটে রেকর্ড আলাদা করার ক্যারেক্টার(গুলো)। ডিফল্টে নিউ লাইন |
| OFMT / Output ForMaT | নামেরিক আউটপুটের ফরম্যাট - ডিফল্ট ফরম্যাট "%.6g" |
awk ব্যবহার উদাহরণ
এই উদাহরণগুলোতে আমরা একটি টেক্সট ফাইল flowers.txt দিয়ে কাজ করব, যাতে নিচের টেক্সট আছে:
red rose yellow daffodil pink flamingo white rose blue iris white lily red peony yellow orchid purple foxglove
ফাইল কন্টেন্ট প্রিন্ট
নিচের awk কমান্ড awk print ফাংশন ব্যবহার করে ফাইল কন্টেন্ট টার্মিনালে আউটপুট করবে:
awk '{print}' flowers.txt ফাইলে রেকর্ড (লাইন) সংখ্যা প্রিন্ট
awk 'END { print NR }' sample.txt এই উদাহরণ ফাইলের লাইন সংখ্যা আউটপুট করবে:
9
রেজুলার এক্সপ্রেশন ব্যবহার করে ফাইলে টেক্সট সার্চ
নিচের কমান্ড ফাইলে শুধু rose টাইপের লাইনগুলো আউটপুট করবে:
awk '/rose/' flowers.txt
নোট: REGEX (Regular Expressions) সিনট্যাক্স ব্যবহার করা হয় সার্চ টেক্সট ডিফাইন করার জন্য।
এই কমান্ড আউটপুট করবে:
red rose white rose
আরও রেজেক্স
awk '/^p/' flowers.txt
এই কমান্ড শুধু p দিয়ে শুরু হওয়া রেকর্ড আউটপুট করবে:
pink flamingo purple foxglove
ফিল্ড ভেরিয়েবল ব্যবহার
ফিল্ড ভেরিয়েবল ব্যবহার করে শুধু প্রথম ফিল্ড আউটপুট করুন p দিয়ে শুরু হওয়া রেকর্ডের জন্য:
awk '/^p/ {print $1;}' flowers.txt যে আউটপুট করবে:
pink purple
অন্য প্রোগ্রামের আউটপুট প্রসেস করা
আপনি অন্য লিনাক্স শেল প্রোগ্রামের আউটপুট awk-এ পাইপ করে প্রসেস করতে পারেন। এই উদাহরণ ls -l কমান্ডের আউটপুট নেয়, যা কারেন্ট ডিরেক্টরির কন্টেন্ট লিস্ট করে এবং ৫ম ফিল্ড (ফাইল সাইজ) রিটার্ন করে:
ls -l | awk '{print $5}' যে কিছু এই আকারে আউটপুট করবে:
3104 3072 224 256
...(কারেন্ট ডিরেক্টরিতে কত ফাইল আছে এবং সেগুলো কত বড় সেটা ডিপেন্ড করে)।
বিল্ট-ইন ভেরিয়েবল ব্যবহার
awk '{print NR "-" $2 }' flowers.txt এই কমান্ড কারেন্ট রেকর্ড নাম্বার (ফাইল লাইন নাম্বার) এবং দ্বিতীয় ফিল্ড - ফ্লাওয়ার নাম প্রিন্ট করবে:
1-red rose 2-yellow daffodil 3-pink flamingo 4-white rose 5-blue iris 6-white lily 7-red peony 8-yellow orchid 9-purple foxglove
অ্যাকশন কম্বাইন করা
কন্ডিশন এবং অ্যাকশন && ব্যবহার করে কম্বাইন করা যায়। এই কমান্ড সকল রেকর্ড প্রিন্ট করবে যেখানে প্রথম ফিল্ডে red টেক্সট আছে এবং দ্বিতীয় ফিল্ডে ৫ ক্যারেক্টারের কম আছে:
awk '$1 ~ /red/ && length($NF) < 5 { print }' flowers.txt নোট:
- $NF ব্যবহার করে দ্বিতীয় ফিল্ডে পৌঁছানো - সম্ভব কারণ এটি লাস্ট ফিল্ড এবং NF (Number of Fields)-এর সমান
- length() ফাংশন ব্যবহার করা হয় ফিল্ডের লেন্থ ক্যালকুলেট করতে
তাই এক্সাম্পল ফাইল থেকে একটে ম্যাচিং রেকর্ড রিটার্ন করে:
red rose
উপসংহার
awk প্রায় সার্বভৌমভাবে লিনাক্সের সাথে আসে একটা কারণের জন্য - এটি টেক্সট সার্চ ও প্রসেসিং-এর একটি স্ট্যাপল টুল, যা আপনি কুইকলি লগ এন্ট্রি খুঁজে বের করতে পারেন যদি সিস্টেমে কিছুরকম প্রোबलেম হয়, বা রিসার্চ ইউজের জন্য ক্যাপচারড ডেটা প্রসেস করতে।
আপনি যদি কখনো বড় কালেকশন টেক্সট ফাইলে সিম্পল ফাইন্ড/রিপ্লেসের বাইরে কিছু করার চেষ্টা করে থাকেন, আপনি জানবেন প্রোগ্রাম্যাটিক্যালি স্পেসিফিক্যালি রিপ্লেসমেন্ট বা আপডেট করার ভ্যালু, ইন্ডিভিজুয়াল ফাইন্ড/রিপ্লেস কমান্ড চালানো ছাড়া।
আরও লিনাক্স টিপস চেক করুন!