ورود/ایجاد حساب کاربری
   منوی اصلی
· خانه
· لیست کاربران
· جستجو
· آمار مشاهدات
· آرشیو مقالات


- شرح
· راهنمای نویسندگان
· درباره ما

   همکاری با نشریه
در صورتی که مایل به همکاری با نشریه هستید، می‌توانید در لیست پستی نشریه عضو شده و در جریان امور قرار گیرید. برای اطلاعات بیشتر، اینجا کلیک کنید.

   کاربران
سردبیر
هیچ مدیر کمکی حاضر
همکاران
هیچ مدیر کمکی حاضر
اعضا:
جدیدترین:جدید امروز:0
جدیدترین:جدید دیروز:0
جدیدترین:مجموع:2471
جدیدترین:جدیدترین:
ufumenarayu
اعضا:حاضر
اعضا:اعضا:0
مهمان‌ها:مهمان‌ها:1
مجموع:مجموع:1
کاربران حاضر
هیچ کاربر حاضری وجود ندارد

   ورود کاربران




 


 برای ورود مشکل دارید؟
 ثبت نام کاربران جدید

آشنایی با awk بخش اول

(2054 مجموع کلمات موجود در متن)
(6981 بار مطالعه شده است)  نسخه چاپی

آشنایی با 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

تمامی مطالب و مقالات این سایت تحت مجوز GNU FDL قرار دارند. بنابراین کپی و ایجاد تغییر در آنها مطابق شرایط این مجوز آزاد می‌باشد.