به منظور فیلتر کردن متن در لینوکس، از ابزاری به نام awk استفاده میشود. شما می توانید دستور awk را همچون یک زبان برنامه نویسی در نظر بگیرید. هنگامیکه ما دستورات خاصی را در Linux/Unix برای خواندن و یا ویرایش متن از یک رشته یا فایل اجرا می کنیم، بیشتر اوقات سعی در فیلتر کردن خروجی میکنیم. در اینجا باید از regular expression (عبارات خاص و با قاعده) استفاده کنیم.
همچنین توصیه میشود مطالعه کنید :
10 دستور مفید در Chaining Operators (عملگرهای زنجیره ای) در لینوکس با مثال عملی
دستور wc برای شمارش تعداد خطوط، کلمه ها و کاراکترها
عبارات خاص چه هستند؟
یک عبارت خاص می تواند به عنوان یک رشته که شامل چندین بخش کاراکتر باشد تعریف شود. یکی از مهم ترین مواردی که درباره عبارات خاص و با قاعده یا اصطلاحا REGULAR EXPRESSION مطرح است، این است که به شما امکان فیلتر کردن خروجی یک دستور یا یک فایل، ویرایش یک بخش از یک متن یا فایل پیکربندی و ... را می دهد.
ویژگی های عبارات خاص
عبارات خاص ساخته شده اند از:
در حوزه ی این راهنما برای استفاده از awk، ما آنرا بصورت یک دستور ساده به عنوان ابزار فیلترینگ خط فرمان پوشش خواهیم داد.
Syntax کلی awk به صورت زیر است:
در ساختار بالا 'script' مجموعه ای از دستورات است که توسط awk قابل درک است و بر روی فایل اجرا می شوند.
این دستور با خواندن یک خط از فایل کار می کند، یک کپی از خط ایجاد کرده و سپس اسکریپت را برروی آن اجرا می کند. این برروی تمامی خطوط فایل تکرار می شود.
'script' به شکل '/pattern/ action' می باشد که pattern در حقیقت یک regular expression می باشد و action آن چیزی است که awk با گرفتن آن pattern برروی یک خط انجام خواهد داد.
نحوه ی استفاده از ابزار فیلترینگ awk در لینوکس
در مثال های زیر، ما برروی متا کاراکترها تمرکز خواهیم کرد که در بالا تحت ویژگی های awk بحث شد.
یک مثال ساده در مورد استفاده از awk:
مثال زیر تمامی خطوط در فایل /etc/host-habili را از آنجایی که هیچ الگویی به آن داده نشده است، چاپ می کند
استفاده از awk با الگو
در مثال زیر الگوی localhost داده شده است، بنابراین awk خطوطی را که دارای localhost هستند را در فایل /etc/hosts جستجو خواهد کرد.
استفاده از awk با wild card (.) در یک الگو
(.) رشته هایی شامل loc, localhost, localnet را در مثال بالا تطبیق خواهد داد.
که به آن * l some_single_character c * نیز می گویند.
استفاده از awk با کاراکتر (*) در یک الگو
دستور awk رشته های شامل localhost, localnet, lines, capable را همچون مثال زیر تطبیق خواهد داد.
همچنین شما خواهید فهمید که (*) تمامی عبارات مچ شده و طولانی ممکنی که تشخیص دهد را برایتان نمایش میدهد.
به یک مثال در این مورد نگاه کنید، عبارت خاص t*t که به معنی رشته هایی است که با حرف t شروع شده و با t پایان می یابد مثل زیر:
شما با استفاده از الگوی /t*t/ تمام خطوط زیر رو خواهید دید:
و (*) در /t*t/ کاراکتر wild card ای است که به awk برای انتخاب آخرین آپشن اجازه می دهد.
استفاده از awk با ست کردن [ character(s) ]
برای مثال [al1] را ست کنید، در اینجا awk تمام رشته ها ی شامل کاراکترهای a یا l یا 1 در فایل /etc/hosts را نمایش خواهد داد:
مثال بعدی رشته هایی را که با K یا k شروع شده و به دنبال آن T آمده است رانمایش میدهد:
تعیین کاراکترها در یک رنج
درک کاراکترها با awk :
[0-9] به معنی یک عدد تک رقمی است.
[a-z] به معنی تنها یک حرف کوچک است.
[A-Z] به معنی تنها یک حرف بزرگ است.
[a-zA-Z] به معنی تنها یک حرف می باشد.
[a-zA-Z 0-9] به معنی تنها یک حرف و یا یک رقم می باشد.
به مثال زیر نگاه کنید:
در مثال بالا تمام خطوط از فایل /etc/hosts را که شامل حداقل تنها یک عدد [0-9] باشد را نمایش خواهد داد.
استفاده از awk با متا کاراکتر (^)
این دستور تمام خطوطی که با الگوی موردنظر شروع می شوند را همچون مثال زیر مچ کرده و نمایش می دهد :
استفاده از Awk با متا کاراکتر ($)
این دستور تمام خطوطی که با الگوی موردنظر پایان می یابند را همچون مثال زیر مچ کرده و نمایش می دهد :
استفاده از Awk با متا کاراکتر (\) Escape
این دستور به شما این امکان را می دهد که کاراکتری که به دنبال دستور می اید را به عنوان یک الگوی دقیق و تحت اللفظی مورد استفاده قرار دهید (عینا همانطور که الگو هست)
در مثال زیر، دستور اول تمام خطوط فایل را چاپ می کند، دستور دوم هیچ چیزی را در خروجی چاپ نمی کند به دلیل اینکه خطی مورد نظرم هست که عبارت $25.00 را داشته باشد،و هیچ کاراکتر escape ی استفاده نشده است.
سومین دستور صحیح است به دلیل اینکه یک کاراکتر escape برای خواندن $ استفاده شده است.
خلاصه
این پست در حقیقت همه چیز در مورد ابزار فیلترینگ awk نیست، مثال های بالا یک سری عملیات ابتدایی awk می باشد. از مطالعه ی شما سپاسگذارم همچنین برای تکمیل بحث و نکات اضافی می توانید نظرات خود را نیز در ادامه مطرح کنید. در قسمت های بعدی ما به صورت پیشرفته تر در مورد نحوه ی استفاده از ویژگی های پیچیده ی awk بحث خواهیم کرد.
همچنین توصیه میشود مطالعه کنید :
دستور AWK در لینوکس جهت استفاده از عبارات خاص برای فیلتر کردن متن یا رشته های متنی در فایل ها (بخش اول)
نحوه استفاده از دستور AWK به منظور Print گرفتن فیلدها و ستون های یک فایل (بخش دوم)
نحوه استفاده از دستور AWK برای فیلتر کردن متن یا رشته های متنی با استفاده از اکشن های خاص Patern (بخش سوم)
نحوه استفاده از عملگرهای مقایسه در دستور AWK در Linux (بخش چهارم)
نحوه استفاده از عبارات ترکیبی به همراه دستور awk در لینوکس (بخش پنجم)
نحوه استفاده از دستور "next" به همراه دستور AWK در Linux (بخش ششم)
نحوه خواندن ورودی دستور AWK از STDIN در Linux (بخش هفتم)
آموزش نحوه استفاده از متغیرها، عبارات عددی و عملگرهای انتسابی در دستور awk (بخش هشتم)
آموزش نحوه کار با پترن های خاص begin و end در دستور awk (بخش نهم)
آموزش AWK در Linux بخش دهم (به زودی)
چگونه به awk اجازه بدهیم از متغیرهای Shell استفاده کند (بخش یازدهم)
آموزش AWK در Linux بخش دوازدهم (به زودی)
همچنین توصیه میشود مطالعه کنید :
10 دستور مفید در Chaining Operators (عملگرهای زنجیره ای) در لینوکس با مثال عملی
دستور wc برای شمارش تعداد خطوط، کلمه ها و کاراکترها
عبارات خاص چه هستند؟
یک عبارت خاص می تواند به عنوان یک رشته که شامل چندین بخش کاراکتر باشد تعریف شود. یکی از مهم ترین مواردی که درباره عبارات خاص و با قاعده یا اصطلاحا REGULAR EXPRESSION مطرح است، این است که به شما امکان فیلتر کردن خروجی یک دستور یا یک فایل، ویرایش یک بخش از یک متن یا فایل پیکربندی و ... را می دهد.
ویژگی های عبارات خاص
عبارات خاص ساخته شده اند از:
- کاراکتر های عادی : همچون space، پرانتز ()، A-Z،a-z،0-9.
- متا کاراکترها : که به کاراکترهای ساده گسترش می یابند، شامل :
- (.) این کاراکتر برای معرفی هر کاراکتری به غیر از خط جدید استفاده می شود.
- (*) این کاراکتر برای 0 (صفر) یا بیشتر کاراکتر بلافاصله قبل از آن استفاده می شود.
- [ character(s) ] این کاراکتر با هر یک از کاراکترهای مشخص شده در character(s) استفاده می شود. همچنین می توان از یک (-) به معنی یک رنج کاراکتر همچون [a-f]، [1-5]، استفاده کرد.
- ^ این کاراکتر شروع یک خط را در یک فایل تعریف می کند.
- $ این کاراکتر پایان یک خط را در یک فایل تعریف می کند.
- \ این به عنوان کاراکتر escape استفاده میشود.
در حوزه ی این راهنما برای استفاده از awk، ما آنرا بصورت یک دستور ساده به عنوان ابزار فیلترینگ خط فرمان پوشش خواهیم داد.
Syntax کلی awk به صورت زیر است:
کد PHP:
# awk 'script' filename
در ساختار بالا 'script' مجموعه ای از دستورات است که توسط awk قابل درک است و بر روی فایل اجرا می شوند.
این دستور با خواندن یک خط از فایل کار می کند، یک کپی از خط ایجاد کرده و سپس اسکریپت را برروی آن اجرا می کند. این برروی تمامی خطوط فایل تکرار می شود.
'script' به شکل '/pattern/ action' می باشد که pattern در حقیقت یک regular expression می باشد و action آن چیزی است که awk با گرفتن آن pattern برروی یک خط انجام خواهد داد.
نحوه ی استفاده از ابزار فیلترینگ awk در لینوکس
در مثال های زیر، ما برروی متا کاراکترها تمرکز خواهیم کرد که در بالا تحت ویژگی های awk بحث شد.
یک مثال ساده در مورد استفاده از awk:
مثال زیر تمامی خطوط در فایل /etc/host-habili را از آنجایی که هیچ الگویی به آن داده نشده است، چاپ می کند
کد PHP:
awk '//{print}' /etc/host-habili
کد PHP:
[root@callcenter ~]# awk '//{print}' /etc/host-habili
127.0.0.1 localhost
127.0.1.1 localhost monitor.tecmint.com wordpress.lan
192.168.0.15 cloud.tecmint.com
192.168.0.104 caeszar.tk
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
[root@callcenter ~]#
استفاده از awk با الگو
در مثال زیر الگوی localhost داده شده است، بنابراین awk خطوطی را که دارای localhost هستند را در فایل /etc/hosts جستجو خواهد کرد.
کد PHP:
awk '/localhost/{print}' /etc/host-habili
کد PHP:
[root@callcenter ~]# awk '/localhost/{print}' /etc/host-habili
127.0.0.1 localhost
127.0.1.1 localhost monitor.tecmint.com wordpress.lan
::1 ip6-localhost ip6-loopback
[root@callcenter ~]#
استفاده از awk با wild card (.) در یک الگو
(.) رشته هایی شامل loc, localhost, localnet را در مثال بالا تطبیق خواهد داد.
که به آن * l some_single_character c * نیز می گویند.
کد PHP:
awk '/l.c/{print}' /etc/host-habili
کد PHP:
[root@callcenter ~]# awk '/l.c/{print}' /etc/host-habili
127.0.0.1 localhost
127.0.1.1 localhost monitor.tecmint.com wordpress.lan
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
[root@callcenter ~]#
استفاده از awk با کاراکتر (*) در یک الگو
دستور awk رشته های شامل localhost, localnet, lines, capable را همچون مثال زیر تطبیق خواهد داد.
کد PHP:
awk '/l*c/{print}' /etc/host-habili
کد PHP:
[root@callcenter ~]# awk '/l*c/{print}' /etc/host-habili
127.0.0.1 localhost
127.0.1.1 localhost monitor.tecmint.com wordpress.lan
192.168.0.15 cloud.tecmint.com
192.168.0.104 caeszar.tk
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
[root@callcenter ~]#
همچنین شما خواهید فهمید که (*) تمامی عبارات مچ شده و طولانی ممکنی که تشخیص دهد را برایتان نمایش میدهد.
به یک مثال در این مورد نگاه کنید، عبارت خاص t*t که به معنی رشته هایی است که با حرف t شروع شده و با t پایان می یابد مثل زیر:
کد PHP:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint.
شما با استفاده از الگوی /t*t/ تمام خطوط زیر رو خواهید دید:
کد PHP:
this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint
و (*) در /t*t/ کاراکتر wild card ای است که به awk برای انتخاب آخرین آپشن اجازه می دهد.
کد PHP:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
استفاده از awk با ست کردن [ character(s) ]
برای مثال [al1] را ست کنید، در اینجا awk تمام رشته ها ی شامل کاراکترهای a یا l یا 1 در فایل /etc/hosts را نمایش خواهد داد:
کد PHP:
awk '/[al1]/{print}' /etc/host-habili
کد PHP:
[root@callcenter ~]# awk '/[al1]/{print}' /etc/host-habili
127.0.0.1 localhost
127.0.1.1 localhost monitor.tecmint.com wordpress.lan
192.168.0.15 cloud.tecmint.com
192.168.0.104 caeszar.tk
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
[root@callcenter ~]#
مثال بعدی رشته هایی را که با K یا k شروع شده و به دنبال آن T آمده است رانمایش میدهد:
کد PHP:
# awk '/[Kk]T/{print}' /etc/hosts
کد PHP:
[root@callcenter ~]# awk '/[Kk]T/{print}' /etc/host-habili
192.168.100.10 KTech-Lab
تعیین کاراکترها در یک رنج
درک کاراکترها با awk :
[0-9] به معنی یک عدد تک رقمی است.
[a-z] به معنی تنها یک حرف کوچک است.
[A-Z] به معنی تنها یک حرف بزرگ است.
[a-zA-Z] به معنی تنها یک حرف می باشد.
[a-zA-Z 0-9] به معنی تنها یک حرف و یا یک رقم می باشد.
به مثال زیر نگاه کنید:
کد PHP:
awk '/[0-9]/{print}' /etc/host-habili
کد PHP:
[root@callcenter ~]# awk '/[0-9]/{print}' /etc/host-habili
127.0.0.1 localhost
127.0.1.1 localhost monitor.tecmint.com wordpress.lan
192.168.0.15 cloud.tecmint.com
192.168.0.104 caeszar.tk
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
[root@callcenter ~]#
در مثال بالا تمام خطوط از فایل /etc/hosts را که شامل حداقل تنها یک عدد [0-9] باشد را نمایش خواهد داد.
استفاده از awk با متا کاراکتر (^)
این دستور تمام خطوطی که با الگوی موردنظر شروع می شوند را همچون مثال زیر مچ کرده و نمایش می دهد :
کد PHP:
# awk '/^fe/{print}' /etc/host-habili
# awk '/^ff/{print}' /etc/host-habili
کد PHP:
[root@callcenter ~]# awk '/^fe/{print}' /etc/host-habili
fe00::0 ip6-localnet
[root@callcenter ~]# awk '/^ff/{print}' /etc/host-habili
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
[root@callcenter ~]#
استفاده از Awk با متا کاراکتر ($)
این دستور تمام خطوطی که با الگوی موردنظر پایان می یابند را همچون مثال زیر مچ کرده و نمایش می دهد :
کد PHP:
# awk '/ab$/{print}' /etc/host-habili
# awk '/ost$/{print}' /etc/host-habili
# awk '/rs$/{print}' /etc/host-habili
کد PHP:
[root@callcenter ~]# awk '/ab$/{print}' /etc/hosts
[root@callcenter ~]# awk '/ost$/{print}' /etc/host-habili
127.0.0.1 localhost
[root@callcenter ~]# awk '/rs$/{print}' /etc/host-habili
ff02::2 ip6-allrouters
[root@callcenter ~]#
استفاده از Awk با متا کاراکتر (\) Escape
این دستور به شما این امکان را می دهد که کاراکتری که به دنبال دستور می اید را به عنوان یک الگوی دقیق و تحت اللفظی مورد استفاده قرار دهید (عینا همانطور که الگو هست)
در مثال زیر، دستور اول تمام خطوط فایل را چاپ می کند، دستور دوم هیچ چیزی را در خروجی چاپ نمی کند به دلیل اینکه خطی مورد نظرم هست که عبارت $25.00 را داشته باشد،و هیچ کاراکتر escape ی استفاده نشده است.
سومین دستور صحیح است به دلیل اینکه یک کاراکتر escape برای خواندن $ استفاده شده است.
کد PHP:
# awk '//{print}' deals.txt
# awk '/$25.00/{print}' deals.txt
# awk '/\$25.00/{print}' deals.txt
کد PHP:
[root@callcenter ~]# awk '//{print}' deals.txt
Buy Now $25.00 RedHat RHCSA/RHCE 7
Hosting 25% OFF
[root@callcenter ~]# awk '/$25.00/{print}' deals.txt
[root@callcenter ~]# awk '/\$25.00/{print}' deals.txt
Buy Now $25.00 RedHat RHCSA/RHCE 7
[root@callcenter ~]#
خلاصه
این پست در حقیقت همه چیز در مورد ابزار فیلترینگ awk نیست، مثال های بالا یک سری عملیات ابتدایی awk می باشد. از مطالعه ی شما سپاسگذارم همچنین برای تکمیل بحث و نکات اضافی می توانید نظرات خود را نیز در ادامه مطرح کنید. در قسمت های بعدی ما به صورت پیشرفته تر در مورد نحوه ی استفاده از ویژگی های پیچیده ی awk بحث خواهیم کرد.
همچنین توصیه میشود مطالعه کنید :
دستور AWK در لینوکس جهت استفاده از عبارات خاص برای فیلتر کردن متن یا رشته های متنی در فایل ها (بخش اول)
نحوه استفاده از دستور AWK به منظور Print گرفتن فیلدها و ستون های یک فایل (بخش دوم)
نحوه استفاده از دستور AWK برای فیلتر کردن متن یا رشته های متنی با استفاده از اکشن های خاص Patern (بخش سوم)
نحوه استفاده از عملگرهای مقایسه در دستور AWK در Linux (بخش چهارم)
نحوه استفاده از عبارات ترکیبی به همراه دستور awk در لینوکس (بخش پنجم)
نحوه استفاده از دستور "next" به همراه دستور AWK در Linux (بخش ششم)
نحوه خواندن ورودی دستور AWK از STDIN در Linux (بخش هفتم)
آموزش نحوه استفاده از متغیرها، عبارات عددی و عملگرهای انتسابی در دستور awk (بخش هشتم)
آموزش نحوه کار با پترن های خاص begin و end در دستور awk (بخش نهم)
آموزش AWK در Linux بخش دهم (به زودی)
چگونه به awk اجازه بدهیم از متغیرهای Shell استفاده کند (بخش یازدهم)
آموزش AWK در Linux بخش دوازدهم (به زودی)