فرمانچاپ در awk دادههای انتخابی را از فایل ورودی استخراج میکند.
موقعی که awk یک سطر از فایل رامیخواند، آن سطر را نسبت به جداکننده فیلد مشخص شده ورودی، FS
، که یک متغیر awk است، ( بخشی به نام «جداکنندههای خروجی» ملاحظه کنید)، به فیلدها تقسیم میکند. این متغیر از پیش تعریف شده است که یک یا چند فاصله یا tab باشد.
متغیرهای $1
, $2
, $3
, ..., $N
مقادیر اولین، دومین، سومین، تا آخرین فیلد سطر ورودی را نگاه میدارند. متغیر $0
(صفر) تمام سطر را در خود نگاه میدارد. این مطلب در تصویر زیر، که ما ۶ ستون از خروجی فرمان df را میبینیم، نمایش داده شده است:
در خروجی دستور ls -l
، نه ستون وجود دارد. دستور print این فیلدها به صورت زیر به کار میبرد:
kelly@octarine ~/test>
ls-l
| awk'{ print $5 $9 }'
160orig 121script.sed 120temp_file 126test 120twolines 441txt2html.shkelly@octarine ~/test>
این فرمان ستون پنجم از لیست بلند فایلها را، که شامل اندازه فابل است، و آخرین ستون، که نام فایل است، را چاپ نموده. این خروجی، بدون استفاده شما از روش رسمی ارجاع به ستونها، که جداسازی آنهایی که میخواهید چاپ شوند، با کامامیباشد، خیلی خوانا نیست. در آن حالت کاراکتر پیشفرض جداکننده خروجی، که به طور معمول فاصله است، بین فیلدهای خروجی خواهد بود.
پیکربندی محلی | |
---|---|
توجه داشته باشید که پیکربندی خروجی فرمان ls |
بدون قالببندی، و فقط استفاده از جداکننده خروجی، خروجی خیلی ناپسند به نظر میرسد. درج چند کاراکتر tab و رشتهای که توضیح دهنده خروجی باشد، خیلی آنرا بهتر خواهد نمود:
kelly@octarine ~/test>
ls-ldh
*
| grep-v
total
| \ awk'{ print "Size is " $5 " bytes for " $9 }'
Size is 160 bytes for orig Size is 121 bytes for script.sed Size is 120 bytes for temp_file Size is 126 bytes for test Size is 120 bytes for twolines Size is 441 bytes for txt2html.shkelly@octarine ~/test>
به کاربرد کاراکتر \ توجه نمایید، که ورودی را طولانی نموده و آن را در سطر بعد ادامه میدهد بدون آنکه پوسته آن را به عنوان دستور جداگانه تفسیر کند. در حالیکه ورودی خط فرمان شما به طور مجازی میتواند طول نامحدودی داشته باشد، نمایشگر شما اینطور نیست، ومخصوصاً کاغذ چاپ نیز چنین نیست. کاربرد \ همچنین کپی و past نمودن سطرهای فوق به یک پنجره ترمینال را میسر میسازد.
گزینه -h
فرمان ls برای فراهم نمودن قالببندی خوانای انسانی اندازه فایلهای بزرگ به کار خروجی میرود. خروجی لیست بلند، موقعی که یک دایرکتوری شناسه فرمان باشد، مقدار کل بلوکهای دایرکتوری را نمایش میدهد. این سطر برای ما بیفایده است، ازاینرو ما کاراکتر ستاره را اضافه نمودهایم . همینطورهم گزینه -d
را به همان علت اضافه کردیم، درحالتیکه ستاره به یک دایرکتوری بسط مییابد.
کاراکتر \ در این مثال ادامه سطر را علامت میزند. به بخشی با نام «کاراکترهای گریز» نگاه کنید.
میتوانید هر تعداد از ستونها و حتی با ترتیب معکوس را خروجی بگیرید. در مثال زیر این مطلب برای نمایش بحرانیترین پارتیشنها به کار رفته است:
kelly@octarine ~>
df-h
| sort-rnk
5
| head-3
| \ awk'{ print "Partition " $6 "\t: " $5 " full!" }'
Partition /var : 86% full! Partition /usr : 85% full! Partition /home : 70% full!kelly@octarine ~>
جدول زیر یک نگاه اجمالی به کاراکترهای خاص قالببندی ارائه میکند:
نقلقولها، علامت دلار، و سایر فوق کاراکترهاباید با کاراکتر گریز \ پوشش داده شوند.
یک عبارت منظم را میتوان با محصور کردن در /ها، به عنوان الگو به کار برد. سپس عبارت منظم در برابر متن کامل هر رکورد امتحان میشود. دستور زبان مربوط به این صورت میباشد:
awk 'EXPRESSION { PROGRAM }'
file(s)
مثال زیر فقط اطلاعات دیسکهای ماشین محلی را نمایش میدهد، فایلسیستمهای شبکه نشان داده نشدهاند:
kelly is in ~>
df-h
| awk'/dev\/hd/ { print $6 "\t: " $5 }'
/ : 46% /boot : 10% /opt : 84% /usr : 97% /var : 73% /.vol1 : 8%kelly is in ~>
کاراکترهای / مستلزم پوشش یافتن هستند، به علت آن که آنها برای برنامه awk دارای معنی ویژه میباشند.
در پایین مثال دیگری که در آن دایرکتوری /etc
را برای فایلهایی که به “.conf” ختم میشوند و همچنین با “a” یا “x”شروع میشوند را با کاربرد عبارتهای منظم توسعهیافته، جستجو میکنیم:
kelly is in /etc>
ls-l
| awk'/\<(a|x).*\.conf$/ { print $9 }'
amd.conf antivir.conf xcdroast.conf xinetd.confkelly is in /etc>
این مثال معنی ویژه کاراکتر نقطه در عبارتهای منظم را تشریح مینماید: اولی بیانگر آنست که ما جستجوی هر کاراکتر پس از اولین رشته جستجو را میخواهیم, دومی پوشش داده شده، چونکه بخشی از یک رشته مورد جستجو( انتهای نام فایل) میباشد.
برای مقدم کردن توضیحات بر خروجی، از جمله BEGIN استفاده کنید:
kelly is in /etc>
ls-l
| \ awk'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
Files found: amd.conf antivir.conf xcdroast.conf xinetd.confkelly is in /etc>
جمله END برای درج متن پس ازکل ورودی پردازش شده، اضافه میشود:
kelly is in /etc>
ls-l
| \ awk'/\<[a|x].*\.conf$/ { print $9 } END { print \ "Can I do anything else for you, mistress?" }'
amd.conf antivir.conf xcdroast.conf xinetd.conf Can I do anything else for you, mistress?kelly is in /etc>
همچنانکه دستورات کمی طولانیتر میگردند، ممکن است بخواهید آنها را در یک اسکریپت قرار دهید، به طوریکه قابل استفاده مجدد گردند. یک اسکریپت awk شامل فرمانهای awk تعیین کننده الگوها و عملیات، میباشد.
به عنوان یک مورد مشروح، یک گزارشی که پارتیشنهای بارگزاری شده ما نمایش دهد، ایجادخواهیم نمود. به بخشی با نام «قالببندی فیلدها» نگاه کنید.
kelly is in ~>
catdiskrep.awk
BEGIN { print "*** WARNING WARNING WARNING ***" } /\<[8|9][0-9]%/ { print "Partition " $6 "\t: " $5 " full!" } END { print "*** Give money for new disks URGENTLY! ***" } kelly is in ~> df -h | awk -f diskrep.awk *** WARNING WARNING WARNING *** Partition /usr : 97% full! *** Give money for new disks URGENTLY! ***kelly is in ~>
awk اول یک پیغام شروع چاپ میکند، سپس تمام سطرهایی را که شامل یک کلمه ۸ یا ۹ حرفی در ابتدای سطر هستند و در ادامه یک عدد دیگر و یک علامت ٪ دارند را قالببندی میکند،. یک پیغام انتهایی نیز اضافه شده است.
نمایان کردن دستور زبان | |
---|---|
Awk یک زبان برنامهنویسی است. دستور زبان آن توسط اکثر ویرایشگرها که توانایی نمایان سازی( highlighting) دستور زبان سایر زبانها از قبیل ، C، Bash، HTML، و غیره را دارند، تشخیص داده میشود. |