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


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

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

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

   ورود کاربران




 


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

آشنایی با awk بخش دوم

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

آشنایی با awk بخش دوم


Regular Expression
در awk
زبان awk از Regular Expression ها بسیار بهتر از grep پشتیبانی می‌کند. امکـان استفاده از عملگرهایی مانند && و || بـه همراه عملگر ! وجود دارد. برای مثال، برای پیدا کردن خطوطی در فایل auth.log که در مـاه Feb و Jun نگاشته نشده و توسط CRON نگاشته شده‌اند، باید دستور زیر را وارد کرد:

# awk '!(/Feb/ || /Jun/) && /CRON/' /var/log/auth.log | less
Mar 1 17:48:50 localhost CRON[5886]: (pam_unix) session opened for user logcheck by (uid=0)
Mar 1 17:48:58 localhost CRON[5886]: (pam_unix) session closed for user logcheck
Mar 1 17:50:01 localhost CRON[7273]: (pam_unix) session opened for user root by (uid=0)
Mar 1 17:50:01 localhost CRON[7273]: (pam_unix) session closed for user root
Mar 1 18:00:01 localhost CRON[7577]: (pam_unix) session opened for user root by (uid=0)
Mar 1 18:00:01 localhost CRON[7577]: (pam_unix) session closed for user root
Mar 1 18:02:01 localhost CRON[7608]: (pam_unix) session opened for user logcheck by (uid=0)
Mar 1 18:02:05 localhost CRON[7608]: (pam_unix) session closed for user logcheck
Mar 1 18:09:01 localhost CRON[8305]: (pam_unix) session opened for user root by (uid=0)
Mar 1 18:09:01 localhost CRON[8305]: (pam_unix) session closed for user root
Mar 1 18:10:01 localhost CRON[8325]: (pam_unix) session opened for user root by (uid=0)
....

حتی این امکان وجود دارد تا مقایسه regex را تنها بر روی یکی از فیلدها انجام دهید:

# awk '$1 !~ /Feb/ && $5 !~ /CRON/' /var/log/auth.log | less

چاپ خروجی در awk
در awk بــا استــفاده از دستورات print و printf می‌توانید خروجی برنامه را چاپ کنید. همانند آنچه در بخش‌های پیشین دیدید، می‌توانید برای چاپ از شماره فیلد مانند 5$ و یا از متنی که بین "” قرار گرفته باشد استفاده کنید. مثلا:

$ awk 'BEGIN { print “line one\nline two\nline three" }'
line one
line two
line three

همانطور که می‌بینید، درج کاراکتر n\ در بین متن باعث شکسته شدن متن چاپی در خطوط جدید می‌شود. تعدادی از این نوع کاراکترهای قابل استفاده عبارتند از:

- کاراکترهای n\: برای چاپ متن در خط جدید
- کاراکترهای a\: برای ایجاد یک alert که معمولا یک بوق می‌باشد
- کاراکترهای b\: بصورت یک backspace عمل می‌کند
- کاراکترهای t\: بصورت کلید tab عمل می‌کند
- کاراکترهای f\: برای ایجاد یک Form Feed
- کاراکترهای v\: برای ایجاد یک tab عمودی
- کاراکترهای \\: برای ایجاد یک backslash
- کاراکترهای "\”\: برای قرار دادن یک کلمه در گیومه مانند:

$ awk 'BEGIN { print "line \"one\"\nline two\nline three" }'
line "one"
line two
line three

این امکان وجود دارد تا بتوانید فیلدهای مورد نظر خود را در خروجی چاپ کنید. به مثال زیر توجه کنید:

# awk '{print $1, $2}' /var/log/auth.log
Feb 1
Feb 1
Feb 1
....

توجه داشته باشید که کامای بین دو فیلد مهم است. در صورتی که این کاما فــراموش شود، دو رشته در خروجی برنامه به هم متصل خواهند شد. خروجی برنامه بالا بدون کاما به صورت زیر خواهد بود:

# awk '{print $1 $2}' /var/log/auth.log
Feb1
Feb1
Feb1
....

برای تمیزکاری بیشتر و برای نمایش توضیحی خـروجی به افرادی که ممکن است با فایل شما آشنا نباشند، می‌توانید با استفاده از تابع BEGIN یک سرایند برای آن چاپ کنید. برای مثال:

# awk 'BEGIN{print "Date\t\Time\t\tHost\n"}{print $1,$2"\t"$3"\t"$4}' /var/log/auth.log
Date Time Host

Feb 1 18:09:01 localhost
Feb 1 18:09:01 localhost
Feb 1 18:14:40 localhost
Feb 1 18:17:01 localhost
Feb 1 18:17:01 localhost
Feb 1 18:17:25 localhost
Feb 1 18:17:25 localhost
Feb 1 18:39:02 localhost
Feb 1 18:39:02 localhost
....

جداکننده‌های خروجی
همانطور کــه در مثــال مــاقبل مشاهده کردید، بطور پیش‌گزیده، با قرار دادن کاما یک فضای خالی (space) بین فیلدهای خروجی چاپ می‌شود. با تنظیم متغییر OFS یــا Output Field Separator می‌توانید بجای فضای خالی، کاراکتر دیگری را بعنوان جداکننده فیلد خروجی قرار دهید.
مغییر دیگری وجود دارد که نام آن ORS یــا Output Record Separator می‌باشد. این متغییر وظیفه جداسازی رکوردها را در خروجی به عهده دارد. مقدار پیش‌گزیده این متغییر n\ یا کاراکتر خط جدید می‌باشد. مقـــادیــر ایـن دو متغییر را باید در بخش BEGIN اسکریپت خود تنظیم کنید. به مثال زیر توجه کنید:

# awk 'BEGIN{ORS="\n----\n"; OFS="\t"; print "Date\t\Time\t\tHost\n"}
> {print $1 $2,$3,$4}' /var/log/auth.log
Date Time Host
----
Feb1 18:09:01 localhost
----
Feb1 18:09:01 localhost
----
Feb1 18:14:40 localhost
----
Feb1 18:17:01 localhost
----
Feb1 18:17:01 localhost

ترجمه و اضافات: آلن باغومیان alan@technotux.com
منبع: http://linuxgazette.net/issue67/nazario.html

PDF Version

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