ট্র্যাক
/
AWK
AWK
/
সিলেবাস
/
ফান্ডামেন্টালস
ফা

ফান্ডামেন্টালস মধ্যে AWK

১টি অনুশীলনী

ফান্ডামেন্টালস সম্পর্কে

আমরা ভাষাটিকে বলব AWK, আর AWK প্রোগ্রাম ইন্টারপ্রিট করে এমন এক্সিকিউটেবলটিকে বলব awk বা gawk।

প্যাটার্ন ও অ্যাকশন

একটি AWK প্রোগ্রাম প্যাটার্ন-অ্যাকশন জোড়া দিয়ে গঠিত

pattern1 { action1 }
pattern2 { action2 }
...

একটি প্যাটার্ন ইনপুটের সাথে মেলানোর জন্য একটি রেগুলার এক্সপ্রেশন প্যাটার্ন হতে পারে। এটি এমন যেকোনো এক্সপ্রেশনও হতে পারে যার ফলাফল একটি ট্রু/ফলস মান।

একটি অ্যাকশন এক বা একাধিক AWK কমান্ড। ঘিরে থাকা ব্রেসগুলো আবশ্যক।

প্যাটার্নের ফলাফল ট্রু হলে সংশ্লিষ্ট অ্যাকশনটি মূল্যায়ন করা হয়।

রেকর্ড ও ফিল্ড

AWK ইনপুটকে এক ধারাবাহিক রেকর্ড হিসেবে পার্স করে। প্রতিটি রেকর্ড শূন্য বা তার বেশি ফিল্ড-এ ভাগ করা হয়।

ডিফল্ট আচরণ হলো:

  • নিউলাইনকে "রেকর্ড সেপারেটর" হিসেবে ব্যবহার করে ইনপুটকে রেকর্ডে ভাগ করা, ফলে প্রতিটি লাইন একটি রেকর্ড।
  • হোয়াইটস্পেসকে "ফিল্ড সেপারেটর" হিসেবে ব্যবহার করে রেকর্ডকে ফিল্ডে ভাগ করা, ফলে প্রতিটি শব্দ একটি ফিল্ড।

প্যাটার্ন ও অ্যাকশন (চলমান)

প্যাটার্ন বাদ দেওয়া যেতে পারে, সেক্ষেত্রে অ্যাকশনটি প্রতিটি ইনপুট রেকর্ডের জন্য মূল্যায়ন করা হয়।

অ্যাকশন বাদ দেওয়া যেতে পারে, সেক্ষেত্রে ডিফল্ট অ্যাকশন হলো বর্তমান রেকর্ডটি প্রিন্ট করা।

বিশেষ প্যাটার্ন

প্রায়ই ব্যবহৃত দুটি বিশেষ প্যাটার্ন আছে।

  • BEGIN কোনো ইনপুট গৃহীত হওয়ার আগেই সংশ্লিষ্ট অ্যাকশন মূল্যায়ন করবে।
  • END সব ইনপুট গৃহীত হওয়ার পরে সংশ্লিষ্ট অ্যাকশন মূল্যায়ন করবে।

ফিল্ড ভ্যারিয়েবল

আপনি ফিল্ডগুলোকে $1, $2, $3 ইত্যাদি দিয়ে নির্দেশ করেন।

বর্তমান রেকর্ডটি $0।

Caution

স্পষ্ট করে বললে, এগুলো কঠোর অর্থে "ভ্যারিয়েবল" নয়। $-কে একটি অপারেটর হিসেবে ভাবা যায়, যা নির্দিষ্ট ফিল্ড নম্বরের মান এনে দেয়। পরবর্তী কনসেপ্টগুলোতে আমরা এ নিয়ে আরও গভীরে যাব।

এখানে আরও কিছু প্রায়ই ব্যবহৃত বিল্ট-ইন ভ্যারিয়েবল রয়েছে।

ইনপুট পার্সিং নিয়ন্ত্রণকারী বিল্ট-ইন ভ্যারিয়েবল

  • RS হলো ইনপুট রেকর্ড সেপারেটর। যেমনটা বলা হয়েছে, এর ডিফল্ট মান একটি নিউলাইন।
  • FS হলো ইনপুট ফিল্ড সেপারেটর।

এই ভ্যারিয়েবলগুলো প্রায়ই BEGIN অ্যাকশন ব্লকে সেট করা হয়।

তথ্য বহনকারী বিল্ট-ইন ভ্যারিয়েবল

প্রোগ্রাম চালানোর সময় AWK এই ভ্যারিয়েবলগুলো স্বয়ংক্রিয়ভাবে সেট করে।

  • NF বর্তমান রেকর্ডে ফিল্ডের সংখ্যা সংরক্ষণ করে।
    • শেষ ফিল্ডের মান পেতে $NF ব্যবহার করুন।
  • NR বর্তমান রেকর্ড নম্বর সংরক্ষণ করে।
    • একাধিক ইনপুট ফাইল প্রসেস করা হলে, NR এখন পর্যন্ত প্রসেস হওয়া মোট রেকর্ডসংখ্যা ধারণ করবে।
  • FNR বর্তমান ইনপুট ফাইলের বর্তমান রেকর্ড নম্বর সংরক্ষণ করে।
    • NR আর FNR-এর পার্থক্য বোঝাতে, এখানে AWK-এর একটি কমন ইডিয়ম দেওয়া হলো।
      NR == FNR {action}
      
      এর মানে হলো "যদি সঞ্চিত রেকর্ড নম্বর বর্তমান ফাইলের রেকর্ড নম্বরের সমান হয়।" এটি শুধু প্রথম ইনপুট ফাইল-এর রেকর্ডের জন্য ট্রু হতে পারে।

ট্রুথিনেস

AWK সি-এর মতো একই ট্রুথিনেস ধারণা ব্যবহার করে:

  • সংখ্যা 0 ফলস।
  • অন্য যেকোনো সংখ্যা ট্রু।

যেহেতু AWK একটি টেক্সট-প্রসেসিং ভাষা, তাই ট্রু/ফলস মান স্ট্রিং পর্যন্ত বিস্তৃত করা হয়েছে।

  • খালি স্ট্রিং "" ফলস।
  • খালি নয় এমন যেকোনো স্ট্রিং ট্রু।
Note

AWK সি-এর মতো একই ট্রুথিনেস ধারণা ব্যবহার করে

AWK-এর জন্ম ১৯৭০-এর দশকে বেল ল্যাবসে, ঠিক যে পরিবেশে সি তৈরি হয়েছিল। C-এর সিনট্যাক্সে AWK-এর বড় প্রভাব পড়েছিল।

Caution

একটি অদ্ভুত বিষয়, যার দিকে খেয়াল রাখবেন

  • সংখ্যা 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
    
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

ফান্ডামেন্টালস শিখুন