আমরা ভাষাটিকে বলব AWK, আর AWK প্রোগ্রাম ইন্টারপ্রিট করে এমন এক্সিকিউটেবলটিকে বলব awk বা gawk।
একটি AWK প্রোগ্রাম প্যাটার্ন-অ্যাকশন জোড়া দিয়ে গঠিত
pattern1 { action1 }
pattern2 { action2 }
...
একটি প্যাটার্ন ইনপুটের সাথে মেলানোর জন্য একটি রেগুলার এক্সপ্রেশন প্যাটার্ন হতে পারে। এটি এমন যেকোনো এক্সপ্রেশনও হতে পারে যার ফলাফল একটি ট্রু/ফলস মান।
একটি অ্যাকশন এক বা একাধিক AWK কমান্ড। ঘিরে থাকা ব্রেসগুলো আবশ্যক।
প্যাটার্নের ফলাফল ট্রু হলে সংশ্লিষ্ট অ্যাকশনটি মূল্যায়ন করা হয়।
AWK ইনপুটকে এক ধারাবাহিক রেকর্ড হিসেবে পার্স করে। প্রতিটি রেকর্ড শূন্য বা তার বেশি ফিল্ড-এ ভাগ করা হয়।
ডিফল্ট আচরণ হলো:
প্যাটার্ন বাদ দেওয়া যেতে পারে, সেক্ষেত্রে অ্যাকশনটি প্রতিটি ইনপুট রেকর্ডের জন্য মূল্যায়ন করা হয়।
অ্যাকশন বাদ দেওয়া যেতে পারে, সেক্ষেত্রে ডিফল্ট অ্যাকশন হলো বর্তমান রেকর্ডটি প্রিন্ট করা।
প্রায়ই ব্যবহৃত দুটি বিশেষ প্যাটার্ন আছে।
BEGIN কোনো ইনপুট গৃহীত হওয়ার আগেই সংশ্লিষ্ট অ্যাকশন মূল্যায়ন করবে।END সব ইনপুট গৃহীত হওয়ার পরে সংশ্লিষ্ট অ্যাকশন মূল্যায়ন করবে।আপনি ফিল্ডগুলোকে $1, $2, $3 ইত্যাদি দিয়ে নির্দেশ করেন।
বর্তমান রেকর্ডটি $0।
স্পষ্ট করে বললে, এগুলো কঠোর অর্থে "ভ্যারিয়েবল" নয়।
$-কে একটি অপারেটর হিসেবে ভাবা যায়, যা নির্দিষ্ট ফিল্ড নম্বরের মান এনে দেয়।
পরবর্তী কনসেপ্টগুলোতে আমরা এ নিয়ে আরও গভীরে যাব।
এখানে আরও কিছু প্রায়ই ব্যবহৃত বিল্ট-ইন ভ্যারিয়েবল রয়েছে।
RS হলো ইনপুট রেকর্ড সেপারেটর।
যেমনটা বলা হয়েছে, এর ডিফল্ট মান একটি নিউলাইন।FS হলো ইনপুট ফিল্ড সেপারেটর।এই ভ্যারিয়েবলগুলো প্রায়ই BEGIN অ্যাকশন ব্লকে সেট করা হয়।
প্রোগ্রাম চালানোর সময় AWK এই ভ্যারিয়েবলগুলো স্বয়ংক্রিয়ভাবে সেট করে।
NF বর্তমান রেকর্ডে ফিল্ডের সংখ্যা সংরক্ষণ করে।
$NF ব্যবহার করুন।NR বর্তমান রেকর্ড নম্বর সংরক্ষণ করে।
NR এখন পর্যন্ত প্রসেস হওয়া মোট রেকর্ডসংখ্যা ধারণ করবে।FNR বর্তমান ইনপুট ফাইলের বর্তমান রেকর্ড নম্বর সংরক্ষণ করে।
NR == FNR {action}
এর মানে হলো "যদি সঞ্চিত রেকর্ড নম্বর বর্তমান ফাইলের রেকর্ড নম্বরের সমান হয়।"
এটি শুধু প্রথম ইনপুট ফাইল-এর রেকর্ডের জন্য ট্রু হতে পারে।AWK সি-এর মতো একই ট্রুথিনেস ধারণা ব্যবহার করে:
0 ফলস।যেহেতু AWK একটি টেক্সট-প্রসেসিং ভাষা, তাই ট্রু/ফলস মান স্ট্রিং পর্যন্ত বিস্তৃত করা হয়েছে।
"" ফলস।AWK সি-এর মতো একই ট্রুথিনেস ধারণা ব্যবহার করে
AWK-এর জন্ম ১৯৭০-এর দশকে বেল ল্যাবসে, ঠিক যে পরিবেশে সি তৈরি হয়েছিল। C-এর সিনট্যাক্সে AWK-এর বড় প্রভাব পড়েছিল।
একটি অদ্ভুত বিষয়, যার দিকে খেয়াল রাখবেন
0 ফলস।"0" ট্রু!পরবর্তী কনসেপ্টগুলোতে আমরা AWK ডেটা টাইপ নিয়ে আরও আলোচনা করব।
কমেন্ট # ক্যারেক্টার দিয়ে শুরু হয় এবং লাইনের শেষ পর্যন্ত চলে।
awk-কে ইনপুট দেওয়ার উপায়awk ফাইল থেকে বা স্ট্যান্ডার্ড ইনপুট থেকে ইনপুট পড়তে পারে।
নিচের যেকোনো কৌশলই কাজ করবে।
awk '/regex/ {print $1}' file1 file2 ...
awk '/regex/ {print $1}' < file
some_command_here | awk '/regex/ {print $1}'
ইউনিক্স-সদৃশ সিস্টেমে /etc/passwd-এ ব্যবহারকারীদের তথ্য থাকে।
প্রতিটি ব্যবহারকারীকে আলাদা লাইনে বর্ণনা করা হয়, যেখানে ফিল্ডগুলো কোলন দিয়ে আলাদা করা থাকে।
ইউজারনেমগুলো তালিকাভুক্ত করতে:
awk '
BEGIN { FS = ":" }
{ print $1 }
' /etc/passwd
লক্ষ্য করুন যে {print $1} অ্যাকশনে কোনো প্যাটার্ন নেই, তাই এটি প্রতিটি রেকর্ডের জন্য চালানো হয়।
আমরা যদি আউটপুট শুধু সেই ব্যবহারকারীদের মধ্যে সীমাবদ্ধ রাখতে চাই যারা লগইন শেল হিসেবে bash ব্যবহার করেন, তাহলে এভাবে করতে পারি:
awk '
BEGIN { FS = ":" }
$7 == "/bin/bash" { print $1 }
' /etc/passwd
এখানে কিছু awk প্রোগ্রাম দেওয়া হলো, যেগুলো ইউনিক্সের অন্যান্য কমন কমান্ডের মতোই একই ফলাফল দেয়।
একটি ফাইল দেখানো
cat file.txt
awk '1' file.txt
ফাইলে প্যাটার্ন খোঁজা
grep 'foo.*bar' file.txt
awk '/foo.*bar/' file.txt
ফাইলের শুরুতে মাত্র কয়েকটি লাইন দেখানো
head -n 20 file.txt
awk '
1
NR == 20 {exit}
' file.txt
ফাইলের টেক্সট প্রতিস্থাপন করা
sed 's/foo/bar/' file.txt
awk '{sub(/foo/, "bar")};1' file.txt
# or more readably
awk '
{
sub(/foo/, "bar")
print
}
' file.txt