মূল content-এ যাও

DevOps/Linux ও Command Line/Lesson 03

Pipes আর text processing

Unix-এর দর্শন হলো ছোট tool, প্রতিটা একটা কাজ, | দিয়ে জোড়া। grep, cut, sort, uniq, wc, head দিয়ে log বিশ্লেষণ, আর Python-এ সেই একই pipeline নিজে বানাও।

সময়
24 মিনিট
Exercise
1
Challenge
1
Quiz
3 প্রশ্ন

সহজ ভাষায়

Unix-এর একটা দর্শন আছে: প্রতিটা program একটা কাজ ভালোভাবে করবে, আর program-গুলো জোড়া লাগানো যাবে। জোড়া লাগানোর আঠা হলো pipe |। একটা command-এর output সোজা পরের command-এর input-এ যায়।

cat access.log | grep "/api/predict" | wc -l
#   পুরো log      শুধু predict-এর লাইন   গোনো

কারখানার conveyor belt-এর মতো। প্রতিটা station একটা কাজ করে, আর পরেরটায় পাঠায়।

কেন দরকার?

Production server-এ সমস্যা হলে প্রথম কাজ হলো log দেখা। আর log প্রায়ই গিগাবাইট আকারের হয়। Python script লেখার আগেই এক লাইনের pipeline দিয়ে উত্তর পাওয়া যায়:

  • "শেষ এক ঘণ্টায় কয়টা 500 error?"
  • "কোন IP সবচেয়ে বেশি request করছে? আক্রমণ নাকি?"
  • "কোন endpoint সবচেয়ে ধীর?"

প্রধান tool

Commandকাজউদাহরণ
grepযেসব লাইনে pattern আছেgrep -i error app.log
cutColumn কেটে নেওয়াcut -d"," -f2 data.csv
sortসাজানো (-n সংখ্যা, -r উল্টো)sort -rn
uniq -cপাশাপাশি একই লাইন গোনাsort | uniq -c
wc -lলাইন গোনাwc -l app.log
head / tailপ্রথম বা শেষ n লাইনtail -f app.log (live দেখা)
awkColumn নিয়ে ছোট হিসাবawk '{print $1}'

Python-এ একই pipeline

প্রতিটা Unix tool-এর কাজ Python-এ এক-দুই লাইনের:

main.py

Shell pipeline দ্রুত একবারের অনুসন্ধানের জন্য ভালো। বারবার চালানো বা জটিল বিশ্লেষণের জন্য Python (pandas) ভালো।

Redirect: output কোথায় যাবে

python3 train.py > train.log          # output file-এ (আগের লেখা মুছে)
python3 train.py >> train.log         # file-এর শেষে যোগ করে
python3 train.py 2> errors.log        # শুধু error (stderr) আলাদা file-এ
python3 train.py > all.log 2>&1       # output আর error দুটোই এক file-এ

Terminal-এ দুটো আলাদা output stream আছে: stdout (সাধারণ output, 1) আর stderr (error, 2)। এজন্যই error আলাদা করে ধরা যায়।

Exercise

Exercise

নিজের grep

+20 XP

grep(lines, pattern, ignore_case=False, invert=False) লেখো। এটা lines-এর (string-এর list) মধ্যে যেগুলোতে pattern আছে, সেগুলোর list return করবে, ক্রম অপরিবর্তিত রেখে।

  • ignore_case=True হলে বড়-ছোট হাতের অক্ষরের পার্থক্য উপেক্ষা হবে (grep -i)
  • invert=True হলে উল্টো, অর্থাৎ যেগুলোতে pattern নেই (grep -v)

(আসল grep regular expression বোঝে। এখানে সাধারণ substring যথেষ্ট।)

solution.py

Quiz

  1. Q1| (pipe) কী করে?
  2. Q2uniq -c-এর আগে sort কেন লাগে?
  3. Q3একটা বড় log-এ কতগুলো লাইনে ERROR আছে, দ্রুত জানার command কোনটা?
0/3 answered

Challenge

Challenge

Pipeline: সবচেয়ে বেশি request কে করল?

+50 XP

একটা web server-এর access log-এ প্রতিটা লাইনের প্রথম শব্দ হলো request করা IP address। এই shell pipeline-টা Python-এ বানাও:

grep -v "/health" access.log | cut -d" " -f1 | sort | uniq -c | sort -rn | head -n 3

top_ips(lines, n=3) লেখো: 1. যেসব লাইনে "/health" আছে সেগুলো বাদ দাও (monitoring-এর request) 2. প্রতিটা লাইনের প্রথম শব্দ (space দিয়ে ভাগ করে) নাও 3. প্রতিটা IP কতবার এসেছে গোনো 4. বেশি থেকে কম ক্রমে সাজাও। সমান হলে IP-র string হিসেবে ছোটটা আগে। 5. প্রথম nটা (count, ip) tuple-এর list return করো

solution.py

বাস্তবে কোথায় ব্যবহার হয়?

রাত ২টায় alert আসে: "API ধীর হয়ে গেছে।" প্রথম ৩০ সেকেন্ডে:

tail -n 10000 /var/log/nginx/access.log | grep " 500 " | wc -l          # কতগুলো error?
tail -n 10000 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
#   কোনো একটা IP কি হাজার হাজার request পাঠাচ্ছে?
journalctl -u model-api --since "10 min ago" | grep -i error | tail -20   # service-এর শেষ error

এই ধরনের অনুসন্ধানে প্রথম এক মিনিটের মধ্যে প্রায়ই সমস্যার দিক বোঝা যায়। পরে পুরো বিশ্লেষণের জন্য log ঠিকঠাক monitoring system-এ পাঠানো হয় (cloud module-এ)।

Interview প্রশ্ন

  • Beginner: Pipe | আর redirect >-এর পার্থক্য কী?
  • Intermediate: একটা log থেকে সবচেয়ে বেশি আসা ১০টা error message কীভাবে বের করবে, এক লাইনে?
  • Advanced: stdout আর stderr কী? 2>&1 কী করে, আর এর অবস্থান কেন গুরুত্বপূর্ণ?

এরপর কী?

এক লাইনের command দারুণ, কিন্তু প্রতিদিন একই ১০টা command হাতে টাইপ করা? এগুলো একটা file-এ লিখে রাখলে হয়ে যায় একটা shell script। Module-এর শেষ lesson: Shell scripting।