آشنایی با awk بخش اول(2054 مجموع کلمات موجود در متن) (6979 بار مطالعه شده است) آشنایی
با awk
بخش
اول
خلاصه زبان
برنامه نویسی awk
در
مقابل Perl
که
زبان یک برنامه نویسی با قابلیتهای
فراوان است، در مقیاس کوچکتری قرار دارد،
ولی awk
را
در بیشتر سیستمهای
لینوکس و یونیکس میتوان
بصورت نصب شده پیدا کرد، یادگیری آن آسانتر
از پرل بوده و تقریبا برای تمامی مواردی
که برای مانیتور کردن سیستم نیاز داریم،
قابل استفاده است.
این
مقاله کوچک سعی دارد شما را برای شروع
یادگیری این زبان برنامه نویسی راهنمایی
کند.
مقدمات زبان
بــرنــامه نویسی awk
یک
زبــان کوچک، با نوشتاری شبیه زبــان C
و طراحی
شده برای پردازش متون مرتب شده با قواعد
خاص میباشد.
مانند
متون خــروجــی از بانکهای
اطلاعاتی و فایلهای
ثبت رخـــداد سیستم.
همانند
پـرل، awk
تماما
حول regular
expression و
patern handling
شکل
گــرفته است.
اگــر
بخــواهیم دقیقتر نگاه
کنیم، پرل نواده زبان awk
به
شمار میرود. نام
بامزه awk
برگرفته
شده از نخستین نگارندههای
این زبان به نامهای
Alfred V.Aho،
Brian W.
Keringhan و
Peter J.
Weinberger است.
شاید
بدانید که Keringhan
یکی
از پدران زبان C
و یکی
از قدرتها در دنیای یونیکس است.
استفاده
از awk
در
یک خط برای
شروع آموزش چگونگی استفاده از awk،
مثالی در مورد چگونگی چاپ چند فیلد خاص
را در یک خروجی ارائه میکنیم:
$ ls /home/alan
| awk '{print $1"\t"$6"\t"$8}'
خروجی
دستور بالا مشابه زیر خواهد بود:
-rw-r--r-- 2004-05-28 xfardic-banner.gif
-rw-r--r-- 2004-05-19 xfardic-banner.jpg
-rw-r--r-- 2004-05-19 xfardic-banner.png
-rw-r--r-- 2004-05-19 xfardic-banner.xcf
drwxr-xr-x 2004-11-21 xfardic-dev
drwxr-xr-x 2004-10-01 xfardic_files
drwxr-xr-x 2005-07-05 xfardic_guide
-rw-r--r-- 2005-07-05 xfardic-guide-1.0.1.tar.gz
-rw-r--r-- 2005-05-13 xfardic-home.html
-rwxrwxrwx 2004-12-25 xfardic.html
-rw-r--r-- 2004-12-25 xfardic-logo-main.png
-rw-r--r-- 2004-03-26 xfardic-logo-main.xcf
همانطور
که مشاهده میکنید، تنها
فیلدهای اول، ششم و
هشتم بر روی خروجی نمایش داده میشوند.
این
سه فیلد نــیــز هــر یـک بــا یــک
کـاراکتر tab
از هم
جدا شدهاند.
بعدا
خواهید دید که از awk
تا چه
اندازهای برای نوشتن
این گونه برنامههای یک
خطی استفاده میشود.
اکنون
اجازه دهید تا به یک برنامه کامل بپردازیم.
ساختار
یک برنامه awk یکی
از ویژگیهای بسیار
خــوب awk
در
کنــار قابلیتهای
فراوانش در مقابل پرل و پیتون، راحت خوانده
شدن برنامههای آن است.
هر
برنامه awk
دارای
سه بخش است:
یــک
بلــوک BEGIN
کــه
قبـل از اینکه هر گونه ورودی خوانده شود
اجرا میشود، یک حلقه
اصلی که به ازای هر خط از ورودی یکبار اجرا
میشود و یــک بلــوک
END کـــه
پــس از اتمام خواندن ورودی اجرا میشود.
بسیار
روشن. من
باز هم بر این قضیه تکیه میکنم،
چون واقعا در مورد awk
واقعیت
دارد.
در
زیر یک برنامه awk
نمایش
داده شده که سعی دارد برخـی از قابلیتهای
این زبان را بکار ببندد.
ببینید
قبل از اینکه آنرا شرح دهیم، میتوانید
بفهمید که چه کاری انجام میدهد؟
#!/usr/bin/awk -f
#
# check the sulog for failures..
# copyright 2001 (c) jose nazario
#
# works for Solaris, IRIX and HPUX 10.20
# modified to work with Linux by Alan Baghumian
BEGIN {
print "--- checking sulog"
failed=0
}
{
if ($6 == "-") {
print "failed su:\t"$7"\tat\t"$1"\t"$2"\t"$3
failed=failed+1
}
}
END {
print "---------------------------------------"
printf("\ttotal number of records:\t%d\n", NR)
printf("\ttotal number of failurs:\t%d\n",failed)
}
متوجه شدید این برنامه چه کاری انجام میدهد؟ ابتدا اجازه دهید تا نگاهی به فرمت ورودی بیاندازیم:
Jun 17 14:34:06 localhost su[15927]: - alan:root alan:root
بسیار خوب، اگر اسکریپت را بخوانید متوجه میشوید که همه چیز با بلوک BEGIN شروع میشود. در برنامه ما، کار این بلوک چاپ یک سرایند در بالای خــروجــی بــرنــامه است. همچنین متغییر failed را برابر صفر قرار میدهد. سپس حلقه اصلی برنامه از ورودی خط فــرمـان فایل var/log/auth.log/ را میخواند. در این فایل ثبت رخداد تمامی ورود و خروجها به سیستم ثبت میشوند. از جمله ورود و خــروجهای نــامــوفق و دستــورات su. مـا در این فایل به دنبال دستورات su ای هستیم که با شکست مواجه شدهاند. در صورتی که چنین خطی در ورودی یافت شـــود، بــرنامه زمان، محل و نام کاربر نـاموفق را بر روی صفحه چاپ خواهد کرد. در پایان نیز تعداد کل رکوردها و تعداد رکوردهای شــکـــست خـــورده را چـــاپ میکـنـد. کافـــی است کدهای فوق را در یک فایل ذخیره کرده (مثلا با نام authlogck) و سپس بــا اسـتـفاده از دستــور chmod به آن مجوز اجرا دهید. سپس آنرا به صورت زیر توسط کاربر ریشه اجرا کنید:
# cat /var/log/auth.log | ./authlogck
خروجی مشابه با زیر دریافت خواهید کرد:
--- checking authlog
failed su: alan:root at Feb 3 21:03:27
failed su: alan:root at Feb 5 17:18:43
failed su: alan:root at Feb 6 17:27:57
failed su: alan:root at Feb 7 17:23:00
failed su: alan:root at Feb 8 21:39:45
failed su: alan:root at Feb 10 11:23:19
failed su: alan:root at Feb 10 11:23:24
failed su: alan:root at Feb 10 14:17:27
failed su: alan:root at Feb 11 18:33:20
failed su: alan:root at Feb 14 18:37:55
failed su: alan:root at Feb 14 18:51:36
failed su: alan:root at Feb 18 11:27:14
failed su: alan:root at Feb 18 11:27:19
failed su: alan:root at Feb 18 13:56:21
failed su: alan:root at Feb 19 08:42:16
failed su: alan:root at Feb 19 11:26:47
failed su: alan:root at Feb 21 19:54:28
failed su: alan:root at Feb 25 00:02:49
failed su: alan:root at Feb 25 09:06:34
failed su: alan:root at Feb 25 18:22:56
failed su: alan:root at Feb 25 18:37:13
failed su: alan:root at Feb 26 19:11:34
failed su: alan:root at Mar 4 08:35:03
failed su: alan:root at Mar 5 18:35:48
failed su: alan:root at Mar 9 17:00:50
failed su: alan:root at Mar 9 20:06:15
failed su: alan:root at Apr 9 11:26:55
failed su: alan:root at Apr 13 18:21:39
failed su: alan:root at Apr 29 20:01:25
failed su: alan:root at May 3 18:32:04
failed su: alan:root at May 8 19:58:03
failed su: alan:root at May 11 20:52:19
failed su: alan:root at May 16 19:51:12
failed su: alan:root at May 17 20:15:12
failed su: alan:root at May 20 11:05:41
failed su: alan:root at Jun 3 16:30:50
failed su: alan:root at Jun 5 14:59:20
failed su: alan:root at Jun 17 11:01:26
failed su: alan:root at Jun 17 12:26:40
failed su: alan:root at Jun 17 14:13:58
failed su: alan:root at Jun 17 14:34:06
---------------------------------------
total number of records: 14136
total number of failurs: 41
در برنامه بالا میتوانید بــه خــوبـی ببینید کـــه دستور printf چگـونه کار میکند. بسیار شبیه فراخوانی printf در زبان C است.
بصورت پیشگزیده، برای awk جداکننده فیلدها، فضای سفید است. میتوانـیـد ایــن مقــدار پیـشگزیده را تغییر دهید. برای مثال در مواردی مانند فایلهای کلمه عبور، آنر میتوانید برای روی یک کالن (:) تنظیم کنید. اسکریپت کوچک زیر فایل passwd را به دنبال حسابهای کاربری ریشه (با شماره کاربری صفر) و حسابهای بدون کلمه عبور میگردد:
#!/usr/bin/awk -f
BEGIN { FS=":" }
{
if ($3 == 0) print $1
if ($2 == "") print $1
}
سایر جداکنندههای داخلی مورد استفاده در awk عبارتند از:
RS: یا record separator که بصورت پیشگزیده بر روی خط جدید یا n\ تنظیم شده است. OFS یا output field separator ORS یا output record separator که بصورت پیشگزیده بر روی خط جدید یا n\ تنظیم شده است.
تمامی این مقادیر از میان اسکریپت قابل تعریف کردن هستند.
ترجمه و اضافات: آلن باغومیان alan@technotux.com
منبع:
http://linuxgazette.net/issue67/nazario.html
PDF Version
|