در گذشته من از پایتون برای نوشتن اسکریپت های کوتاه و کاربردی استفاده میکردم با این حال بعد از مدتی من نیاز اینو پیدا کردم که برای پروژه هام از اسکریپت های کوچک Bash هم استفاده کنم.
من فهمیدم که اضافه کردن مقداری از فرمان AWK در یک خط از اسکریپت Bash ، میتونه جایگزین چندین خط از کدهای پایتون بشه.
کلمه AWK برگرفته از حرف اول نام نویسندگان این برنامه هست که به ترتیب نام اونها هست
Alfred Aho, Peter Weinberger, and Brian Kernighan
و این یک برنامه قدیمی (سال 1994) برای استخراج متن و گزارش گیری هست.
نکته خوب راجع به AWK اینه که شما تنها با یاد گیری چند فرمان از اون میتونید استفاده های مناسب و کاربردی ای ازش بکنید.
استفاده از Bash/AWK در یک مثال:
من در حال کار روی یک سیستم هوشمندسازی منازل با استفاده از سخت افزار Raspberry pi بودم.
روی این کامپیوتر کوچک مقدار زیادی کامپوننت های افزودنی اضافه کرده بودم و نگران این بودم که ممکنه این کار باعث سربار (overload) مقدار زیادی محاسبات پردازشی روی سیستم بشه و میخواستم که بتونم مقدار idle time در cpu رو در هر لحظه اندازه گیری و مانیتور کنم.
این سیستم دستیار خانگی قابلیت دریافت فرمان در قالب command line رو دارا هست ، پس کافیه که idle time رو با استفاده از فرمان iostat در لینوکس دریافت کنم.
مقدار idle time در خط چهارم و آیتم ششم خروجی این فرمان قابل دیدن هست.
با استفاده از AWK من میتونم که فقط idle time رو بگیرم (با استفاده از فرمان زیر)
$ iostat | awk '{if (NR==4) print $6}'
96.92
منطق و بررسی شروط مورد استفاده در فرمان AWK می بایست داخل براکت {} و سینگل کوت ’ قرار بگیرد .این منطق بما میگوید که اگر شماره خط (Number of Record ) یا همان NR برابر 4 بود ، مقدار آیتم ششم آن را چاپ کن.
بعد از آنکه توانستم مقدار idle time رو بگیرم ،حالا میتونم این فرمان رو در قالب سنسور به سیستمم در مسیر
(/config/configuration.yaml)
اضافه کنم.این کار قابلیت مانیتور و باخبر کردن رو به من میده.
sensor:
platform: command_line
name: Idle Time
command: "iostat | awk 'NR==4' | awk '{print $6}'"
unit_of_measurement: "%"
بعضی از دستور های پر استفاده در AWK
ممکنه که یک نسخه پیشرفته از AWK یا GAWK (GNU AWK) قبلا در سیستم تون نصب باشه.
برای نصب در Raspberry pi میتونید از فرمان زیر استفاده کنید:
sudo apt-get install gawk
در این لینک بعضی از بهترین مثال های AWK وجود داره که کاربردیه.
گرفتن قسمتی از یک رشته substr(string,position,length)
یک مثال برای استفاده از substr میتونه این باشه که دمای cpu رو بگیریم
$ sensors | grep CPU | awk '{print substr($2,2,4)}'
44.0
به تابع ()substr گفتیم که آیتم دوم (+44.0°C) رو بما بده و از کاراکتر دوم شروع کن و چهار کاراکتر بعدش رو بما نمایش بده.
چاپ ( ()print ) خروجی برحسب بررسی شرط ( ()if ) لازم در AWK
دستور AWK میتونه از شرط ()if برای فیلتر گذاری مناسب در چاپ خروجی استفاده کنه.
یک مثال در این رابطه میتونه فیلتر گذاری روی دستور ps باشه که یک دید کلی از وضعیت فعلی پراسس ها بما میده و ما میتونیم تنها خطوطی رو چاپ کنیم که زمانی برای نمایش داشته باشند (خطوط مورد نیاز ما)
$ # SHOW ALL PROCESSES
~$ ps -e
PID TTY TIME CMD
1 ? 00:00:03 systemd
2 ? 00:00:00 kthreadd
4 ? 00:00:00 kworker/0:0H
6 ? 00:00:00 mm_percpu_wq
7 ? 00:00:00 ksoftirqd/0
8 ? 00:01:10 rcu_sched
...
~$ # SHOW ONLY PROCESSES WITH TIME
~$ ps -e | awk '{if ($3 != "00:00:00") print $0}'
PID TTY TIME CMD
1 ? 00:00:03 systemd
8 ? 00:01:10 rcu_sched
10 ? 00:00:06 migration/0
15 ? 00:00:03 migration/1
...
گرفتن زمان و فرمت بندی آن با ()strftime و ()systime
این توابع زمانی به ما این امکان رو میده که time stamps رو در خروجی استفاده کنیم و زمان خودمون رو به دلخواه فرمت بندی کنیم.
مثلا در مثال های قبل ما نحوه گرفتن دمای cpu را دیدیم ، حالا میتونیم تاریخ و زمان دریافت دما رو هم به خروجی اضافه کنیم.
$ sensors | grep CPU | awk '{print strftime("%H:%M:%S ",systime()) $1 $2 }'
11:06:18 CPU:+45.0°C
سخن نهایی
در نهایت فهمیدیم که یادگیری و استفاده از AWK میتونه واقعا نتیجه خوبی رو بهمون بده.
استفاده AWK میتونه توی اسکریپت نویسی خیلی کاربردی باشه اما اگه قراره که اسکریپت پیچیده بنویسیم بازهم پایتون بیشتر بدرد میخوره :)
موفق باشید.