وقتی ما اسکریپت های Shell را می نویسیم معمولاً از برنامه ها و دستورهای کوچکتر دیگر مثل AWK در اسکریپت مان استفاده می کنیم. در مورد awk ما باید روش های پاس دادن مقادیر را از شل به درون عملیات awk پیدا کنیم.
برای این منظور می نوانیم از متغیرهای shell در دستورات AWK استفاده کنیم. در این مقاله، ما یاد خواهیم گرفت چگونه به AWK اجازه بدهیم از متغیرهای shell استفاده کند که ممکن است شامل مقادیری باشند که ما می خواهیم در دستور awk قرار دهیم.
2 راه ممکن وجود دارد که میتوانید AWK را برای استفاده از متغیرهای شل توانمند سازید :
1 - استفاده از Quotation در Shell
بگذارید یک مثال برای نشان دادن چگونگی استفاده از quotation در شل برای جایگزینی مقدار متغیر شل در فرمان awk نگاهی بیاندازیم. در این مثال میخواهیم یک username را درون فایل /etc/passwd جستجو کنیم و اطلاعات حساب کاربر را فیلتر و چاپ کنیم.
پس میتوانیم اسکریپت test.sh را با محتوای زیر بنویسیم :
سپس فایل را ذخیره کنید و خارج شوید.
تفسیر دستور AWK در اسکریپت test.sh :
"/$username/ " - از quotation در شل برای جانشینی مقدار متغیر شل username در کامند awk استفاده میشود. مقدار username یک الگویی است که در فایل /etc/passwd جستجو می شود.
توجه کنید که Double Quote خارج از اسکریپت awk است.
‘{ print $0 }’
سپس به script پرمیژن اجرایی بدهید و مانند زیر آنرا اجرا کنید :
پس از اجرای اسکریپت، از شما خواسته می شود که یک نام کاربری وارد کنید، کافیست یک نام کاربری معتبر وارد کنید و Enter را فشار دهید. سپس شما جزئیات حساب کاربر را از فایل /etc/passwd همانند زیر مشاهده می کنید :
2 - اختصاص دادن متغیر در AWK
این روش در مقایسه با روش بالا بسیار ساده تر و بهتر است. مثال بالا را در نظر بگیرید، میتوانیم یک فرمان ساده برای انجام کار را اجرا کنیم. در این روش، ما از آپشن -v برای تخصیص مقدار یک متغیر shell به یک متغیر awk استفاده می کنیم.
نخست، یک متغییر username بسازید و سپس یک اسم را به آن اختصاص دهید که می خواهیم در فایل /etc/passwd جستجو شود :
سپس فرمان زیر را تایپ کنید و Enter بزنید :
توضیح دستور بالا :
-v : آپشنی در awk برای مشخص کردن یک متغییر
username : یک متغیر شل است
name : یک متغیر awk است
اجازه دهید نگاهی دقیق به $0 ~ name درون اسکریپت awk بیاندازیم.
' $0 ~ name {print $0}' . اگر در خاطرتان باشد در بخش چهارم از سری مقالات AWK درباره عملگرهای مقایسه ای یکی از عملگرهای مقایسه ای عملگر ~ بود که به معنای true میباشد البته در صورتی که مقدار با الگو یکسان باشد.
output($0) از دستور cat که به awk پایپ ”|” می شود با الگوی (mohammad) مچ (match) میشود، نامی است که ما آن را در /etc/passwd جستجو می کنیم مطابقت داده می شود و در نتیجه عملیات مقایسه ای درست (True) میباشد. خطی که شامل اطلاعات حساب کاربر است بروی صفحه چاپ می شود.
همچنین توصیه میشود مطالعه کنید :
آموزش کامل دستور AWK در لینوکس
نتیجه
ما ویژگی هایی مهم از AWK را پوشش داده ایم، که به ما اجازه می دهند متغیرهای شل را در فرمان awk استفاده کنیم. بارها شما برنامه های کوچک awk یا فرمان هایی در اسکریپت های شل خواهید نوشت و بنابراین شما نیاز به درک شفافی از چگونگی استفاده متغیرهای شل درون فرمان awk دارید.
در بخش بعدی از سری آموزش های AWK ما بخش حیاتی ای از ویژگی های awk را کشف خواهیم کرد که بسیار مهم هستند. پس همراه ما باشید و اجازه دهید یاد بگیریم و به اشتراک بگذرایم.
برای این منظور می نوانیم از متغیرهای shell در دستورات AWK استفاده کنیم. در این مقاله، ما یاد خواهیم گرفت چگونه به AWK اجازه بدهیم از متغیرهای shell استفاده کند که ممکن است شامل مقادیری باشند که ما می خواهیم در دستور awk قرار دهیم.
2 راه ممکن وجود دارد که میتوانید AWK را برای استفاده از متغیرهای شل توانمند سازید :
1 - استفاده از Quotation در Shell
بگذارید یک مثال برای نشان دادن چگونگی استفاده از quotation در شل برای جایگزینی مقدار متغیر شل در فرمان awk نگاهی بیاندازیم. در این مثال میخواهیم یک username را درون فایل /etc/passwd جستجو کنیم و اطلاعات حساب کاربر را فیلتر و چاپ کنیم.
پس میتوانیم اسکریپت test.sh را با محتوای زیر بنویسیم :
کد PHP:
#!/bin/bash
#read user input
read -p "Please enter username:" username
#search for username in /etc/passwd file and print details on the screen
cat /etc/passwd | awk "/$username/ "' { print $0 }'
تفسیر دستور AWK در اسکریپت test.sh :
کد PHP:
cat /etc/passwd | awk "/$username/ "' { print $0 }'
توجه کنید که Double Quote خارج از اسکریپت awk است.
‘{ print $0 }’
سپس به script پرمیژن اجرایی بدهید و مانند زیر آنرا اجرا کنید :
کد PHP:
$ chmod +x test.sh
$ ./text.sh
2 - اختصاص دادن متغیر در AWK
این روش در مقایسه با روش بالا بسیار ساده تر و بهتر است. مثال بالا را در نظر بگیرید، میتوانیم یک فرمان ساده برای انجام کار را اجرا کنیم. در این روش، ما از آپشن -v برای تخصیص مقدار یک متغیر shell به یک متغیر awk استفاده می کنیم.
نخست، یک متغییر username بسازید و سپس یک اسم را به آن اختصاص دهید که می خواهیم در فایل /etc/passwd جستجو شود :
کد PHP:
username="mohammad"
کد PHP:
# cat /etc/passwd | awk -v name="$username" ' $0 ~ name {print $0}'
توضیح دستور بالا :
-v : آپشنی در awk برای مشخص کردن یک متغییر
username : یک متغیر شل است
name : یک متغیر awk است
اجازه دهید نگاهی دقیق به $0 ~ name درون اسکریپت awk بیاندازیم.
' $0 ~ name {print $0}' . اگر در خاطرتان باشد در بخش چهارم از سری مقالات AWK درباره عملگرهای مقایسه ای یکی از عملگرهای مقایسه ای عملگر ~ بود که به معنای true میباشد البته در صورتی که مقدار با الگو یکسان باشد.
output($0) از دستور cat که به awk پایپ ”|” می شود با الگوی (mohammad) مچ (match) میشود، نامی است که ما آن را در /etc/passwd جستجو می کنیم مطابقت داده می شود و در نتیجه عملیات مقایسه ای درست (True) میباشد. خطی که شامل اطلاعات حساب کاربر است بروی صفحه چاپ می شود.
همچنین توصیه میشود مطالعه کنید :
آموزش کامل دستور AWK در لینوکس
نتیجه
ما ویژگی هایی مهم از AWK را پوشش داده ایم، که به ما اجازه می دهند متغیرهای شل را در فرمان awk استفاده کنیم. بارها شما برنامه های کوچک awk یا فرمان هایی در اسکریپت های شل خواهید نوشت و بنابراین شما نیاز به درک شفافی از چگونگی استفاده متغیرهای شل درون فرمان awk دارید.
در بخش بعدی از سری آموزش های AWK ما بخش حیاتی ای از ویژگی های awk را کشف خواهیم کرد که بسیار مهم هستند. پس همراه ما باشید و اجازه دهید یاد بگیریم و به اشتراک بگذرایم.