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 |
cut | Column কেটে নেওয়া | 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 দেখা) |
awk | Column নিয়ে ছোট হিসাব | awk '{print $1}' |
Python-এ একই pipeline
প্রতিটা Unix tool-এর কাজ Python-এ এক-দুই লাইনের:
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
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 যথেষ্ট।)
Quiz
Challenge
Challenge
Pipeline: সবচেয়ে বেশি request কে করল?
একটা 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 করো
বাস্তবে কোথায় ব্যবহার হয়?
রাত ২টায় 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।