آشنایی با awk بخش دوم(758 مجموع کلمات موجود در متن) (5626 بار مطالعه شده است) آشنایی
با 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
|