آشنایی با awk بخش سوم(809 مجموع کلمات موجود در متن) (5109 بار مطالعه شده است) آشنایی
با awk
بخش
سوم
عملگرهای
Regular
Expression ایــن
امــکان وجــود دارد تــا بتــوانید
Regular
Expression هــا
را بــا کــاراکتـرهای ویژهای
که به آنها عملگرهای Regular
Expression اطلاق
میشود، ترکیب کنید.
این
کار باعث میشود تا
بتوانید عمــلــکرد و قـدرت Regular
Expression ها
را افزایش دهید.
میتوانید
از کاراکترهایی که در بخش چاپ خروجی به
آنها اشاره شد را به همراه Regex
ها
بکار بگیرید.
این
کاراکترها در مراحل نخست پردازش شناسایی
شده و به کاراکترهای اصلی تبدیل
میشوند. اکنون
به این کاراکترها میپردازیم:
کاراکتر
\ بکاربردن
این کاراکتر، معنی مخصوص برخی از کاراکترها
را از میان میبرد.
برای
مثال، $\
بـه
معنــی خـــود کــاراکتــر دلار تفسیر
میشود و نه یک متغییر
خاص.
کاراکتر
^ به
معنای نقطه شروع یک رشته متنی اسـت.
بــرای
مثــال chapter@^
بصــورت
chapter@ تفسیر
شــده و بــرای مثال میتواند
بــرای تشخیص شـــروع فصــول در یــک
فــایــل منبـع Texinfo
بکار
گرفته شود.
کاراکتر
^ به
نام anchor
خوانده
میشود زیرا باعث میشود
الگو تنها در جایی که یک رشته متنی شروع
شده باشد، مصداق داشته باشد.
توجه
داشته باشید که از این کاراکتر نمیتوان
بـــرای تشخیــص نقطه شروع یک خط جدید در
میان یک رشته استفاده کرد.
برای
مثال شرط زیر صحیح نخواهد بود:
if
(“line1\nLINE 2” ~ /^L/) ...
کاراکتر
$ این
کاراکتر مشابه با کاراکتر ^
بوده
با این تفاوت کــه نقــطه پـایـانی یـک
رشتـه متنی را مشخص میکند.
برای
مثال $p
رکوردی
را مشخص میکند که با یک
کاراکتر p
خاتمه
پیدا کرده باشد.
همانند
کاراکـتـر ^
از $
نیـز
نمیتوان برای مشخص کردن
نقطه پایان خط که در میان یک رشته متنی
قرار دارد استفاده کرد.
بنابراین
شرط زیر صحیح نیست:
if
(“line1\nLINE 2” ~ /1$/) ...
کاراکتر
.
(نقطه) میتواند
نشانگر هر تک کاراکتر شامل کــاراکتر خط
جدید باشد.
برای
مثال، P.
به
معنی هر تک کاراکتری است که پس از آن
کاراکتر P
قرار
دارد. با
این حساب میتوانید یــک
Regex بـه
صورت U.A
ایجاد
کنید که معنی آن هر کلمه سه کاراکتری است
که ابتدای آن U
و
انتهای آن A
قرار
دارد.
[...]
(لیست
کاراکترها) هر
کاراکتری را که در بین براکتها
قــرار داده شــده باشد را شامل میشود.
برای
مثال [MVX]
هرکدام
از کاراکترهای M،
V و
X را
در یک رشته شامل میشود.
محدوده
کــاراکتــرها را میتـــوان
بــا استــفاده از یک خط تیره یا کاراکتر
hyphen مشخص
کرد. برای
مثال، [a-dx-z]
معادل
[abcdxyz]
میباشد.
توجه
داشته باشیــد ایــن امــر هنگامی صادق
است که تنظیــمات محـلی سیستم روی C
قرار
داشته باشد.
بسیاری
از تنظیمات محلی دیگر معمولا کــاراکتـــرها
را بــا تــرتـیــب واژهنامهای
لیست میکنند، بنابراین
مثال بالا معادل خواهد بود با [aBbCcDdxXyYz].
با
تنظیم متغییر محیطی LC_ALL
بر روی
C میتوانید
از بــراکــتها به حالت
سنتـی تنظیمات محلی C
استفاده
کنید، حتی اگر locale
سیستم
بر روی مقدار دیگری تنظیم شده باشد.
بــرای
اینکه بتوانید یک کاراکتر \
یا [
یا –
یا ^ را
در یک لیست کاراکتر بگنجانید، قبل از آن
\ قرار
دهید. برای
مثال:
[d\]]
که
d و
[ را
شامل خواهد شد.
این
رفتــار کاراکتر \
در
کلـیه نگارشهای مختلف
زبان awk
تعریف
شده است.
یکی
دیگر از ویژگیهای قابل
استفاده، کلاسهای کاراکتری تعریف شــده
در اسـتاندارد POSIX
هستند.
این
کلاسها شامل یک :]،
یک کلیدواژه و یک [:
میباشند.
این
کلاسها به قرار زیر هستند:
[:alnum:]
|
کاراکترهای
Alphanumeric
|
[:alpha:]
|
کاراکترهای
الفبایی
|
[:blank:]
|
کاراکترهای
Space و
Tab
|
[:cntrl:]
|
کاراکترهای
کنترل
|
[:digit:]
|
کاراکترهای
عددی
|
[:graph:]
|
کاراکترهای
قابل دیدن و چاپ
|
[:lower:]
|
کاراکترهای
الفبایی کوچک
|
[:print:]
|
کاراکترهای
قابل چاپ
|
[:punct:]
|
کاراکترهای
نشانه گذاری
|
[:space:]
|
کاراکترهای
شامل فضای خالی مانند tab
و
space
|
[:upper:]
|
کاراکترهای
الفبایی بزرگ
|
[:xdigit:]
|
کارکترهایی
که ارقام هگزادسیمال هستند
|
[...^]
(لیست
کاراکترهای متمم) این
یک امکان تکمیل کننده برای لیست کاراکترها
است. نخستین
کاراکتر پس از براکت آغازین باید یک
کاراکتر ^
باشد.
معنی
آن تمامی کاراکترهایی است بجز آنچه در
لیست قرار داده شدهاند.
کاراکتر
|
(تناوب) از
این کاراکتر برای مشخص کردن یک گزینه
جایگزین برای شرط استفاده میشود.
همانند
عملگر or
در
زبانهای برنامه نویسی.
برای
مثال:
^P|[[:digit:]]
شامل
تمامی رشتههای متنی
است که با P
شروع
شده یا حاوی عدد باشند.
(...) برای
دسته کردن Regex
هایی
است که در میان آنها از کاراکتر تناوب
استفاده شده است.
برای
مثال:
;@(samp|code)\{[^}]+\}
میتواند
در مورد هر دو رشته زیر مصداق داشته باشد:
;@code{foo}
or @samp{bar}
در
مورد کاراکتر +
که در
مثال بالا آورده شده است، جلوتر توضیح
خواهیم داد.
کاراکتر
* از
ایـن کاراکتر میتواند
برای تمامی کاراکترهایی که پس از یک حرف
یک یا چند بار تکرار شدهاند
استفاده کرد.
برای
مثال *ph
میتــوانــد
شــامل کلیه کاراکترهایی باشد که با p
شروع
شده و پس از آنها به هر تعدادی h
قرار
داشته باشد.
در
صورتی که هیچ h
ای
مـوجود نبود، p
تنها
نیز در شمول این Regex
قرار
خواهد گرفت.
برای
اینکه بتوانید کاراکتر *
را
برای بررسی تکرار چندین کاراکتر استفاده
کنید، باید از پرانتز استفاده شود.
به
مثال زیر توجه کنید:
$ awk
'/\(c[ad][ad]*r x\)/ { print }' sample
دستور
بالا تمامی رکوردهای فایل sample
را
خوانده و رکوردهایی مانند خروجی مثال زیر
را چاپ میکند:
(car
x) (cadr x)
کاراکتر
+ این
کاراکتر مشابه کاراکتر *
بوده
بـا این تفاوت که کاراکتر مورد نظر حتما
باید یکبار تکرار شده باشد.
این
امر به این معنی است که wh+y
میتواند
شامل why و
whhy و
نــه wy
باشد.
مثــال
زیــر روش نـگـارش ســادهتر
مثال قبل با استفاده از کاراکتر +
است:
$ awk '/\(c[ad]+r x\)/ { print }' sample
کاراکتر
? این
کاراکتر مشابه کاراکتر *
بوده
با ایــن تفــاوت کــه قسـمت مورد نظر
باید یکبار یا هیچ بار تکرار شود و لاغیر.
مثلا
fe?d میتواند
شامل fed و
fd باشد
و نه چیز دیگر.
{n}
یا
{,n} یا
{n,m} یک
یا دو شماره درون یک براکت میتواند
نمایانگر تکرار تــعداد مشخصی از یک رشته
باشد. برای
مثال wh{3}y
میتواند
شـامل whhhy
و نه
why یا
whhhhy باشد.
یا
wh{3,5}y شامل
whhhy،
whhhhy و
whhhhhy است.
در
صورتی که پس از عــدد یک کاما قرار گیرد،
تکرارهای بیشتر از آن شمرده خواهند شد.
این
امکان در ابتدا در زبان awk
پیاده
سازی نشده بود و بعدا برای ایجاد سازگاری
با استاندارد POSIX
به آن
افزوده شد.
ترجمه
و اضافات: آلن
باغومیان alan@technotux.com
منبع:
http://linuxgazette.net/issue67/nazario.html
،
GNU/Awk
User's Guide
PDF Version
|