این پست هشتمین بخش از سری مقالات awk میباشد و به نظر من از اینجا به بعد دستورات هیجان انگیزتر میشوند. در هفت قسمت گذشته ما وارد مباحثی از awk شدیم که برای اجرای یکسری فیلترینگ های ابتدایی متن یا عبارت (string) در لینوکس شما باید در استفاده از این دستور حرفه ای باشید.
با شروع این قسمت ما قصد داریم به مباحث پیشرفته ای در awk بپردازیم تا به توسط آن بتوانید عملیات پیشرفته فیلتر کردن متن یا string را انجام دهید، بنابراین ما قصد داریم که قابلیت های awk همانند متغیر ها (variables)، عبارت های عددی (numeric expressions) و عملگر های انتسابی (assignment operators) را پوشش دهیم.
مباحثی که در این جا مطرح می شود با آنچه شما در زبان های برنامه نویسی دیگر مانند Shell ،C ،Python، و بسیاری از زبان های دیگر مواجه میشوید به صورت گسترده متفاوت و مجزا نیست پس تیتر این مطلب شما را نگران نکند، ما به صورت ساده ویژگی هایی را که در بالا گفتیم را توضیح خواهیم داد.
این قسمت شاید یکی از آسانترین بخش های دستور awk باشد پس بشینید و ما را دنبال کنید :
1 - متغیر های AWK
در همه زبان های برنامه نویسی، یک متغیر (variable) جایی برای ذخیره کردن یک مقدار (value) است، زمانیکه شما یک متغیر در یک برنامه ایجاد میکنید، هنگامی که فایل را اجرا می کنید مقداری از فضا در حافظه کامپیوتر ایجاد شده و مقداری که شما برای متغیر در نظر گرفته اید را در آنجا ذخیره میشود.
متغیر های awk را به شیوه ای یکسان همانند متغیر های Shell و به شکل زیر می توانید تعریف کنید.
در syntax بالا :
variable_name : نامی است که شما به یک متغیر میدهید.
value : مقداری است که در این متغیر ذخیره می شود.
حال بیاید به مثال بعدی نگاهی بیندازیم :
با بررسی مثال ساده بالا در اولین تعریف متغیر، مقدار linux-zone.org به متغیر computer_name اختصاص یافته است.
علاوه بر این، مقدار 22 به متغیر port_no اختصاص یافته است، همچنین می توانید مقدار یک متغیر را به یک متغیر دیگر اختصاص دهید مانند مثال آخر که مقدار متغیر computer_name را به متغیر server اختصاص داده شده است.
اگر از قسمت دوم سری آموزش awk به یاد داشته باشید نحوه ویرایش field ها را پوشش داده ایم، و درباره اینکه چگونه دستور awk خطوط ورودی را درون field ها پخش می کند و از عملگر دسترسی به field استاندارد '$' که برای خواندن فیلد های متفاوت که به تازگی آنالیز شده اند، استفاده میشود بحث خواهیم کرد. همچنین می توانیم از متغیر ها برای ذخیره مقادیر field ها به صورتت زیر استفاده کنیم :
در مثال بالا مقدار متغیر first_name در فیلد دوم و مقدار متغیر second_name در فیلد سوم تعریف می شود .
برای روشن تر شدن مطلب، یک فایل به نام linuxzone.txt را در نظر بگیرید که شامل لیستی از کاربران یک نرم افزار است که دارای نام، نام خانوادگی و جنسیت است. با استفاده از دستور cat میتوانید محتویات این فایل را همانند زیر مشاهده کنیم.
همچنین می توانیم با استفاده از متغیرهای first_name و second_name نام و نام خانوادگی اولین کاربر در این لیست را با استفاده از کامند awk ذخیره کنیم :
حال بیایید یک مورد دیگر را بررسی کنیم، وقتی شما دستور uname –a را در ترمینال خود اجرا می کنید، برای شما مشخصات کامل سیستم نمایش داده می شود.
فیلد دوم شامل hostname شماست، بنابراین می توانیم hostname را در یک متغیر به نام hostname ذخیره کنیم و آن را با awk همانند زیر نمایش دهیم :
2- عبارت های عددی (Numeric Expressions)
در Awk عبارت های عددی با استفاده از عملگرهای عددی زیر ساخته شده اند.
* : multiplication operator ( عملگر ضرب )
+ : addition operator ( عملگر جمع )
/ : division operator ( عملگر تقسیم )
- : subtraction operator ( عملگر تفریق )
% : modulus operator ( عملگر قدرمطلق )
^ : exponentiation operator ( عملگر توان )
نحوه استفاده از Expression های عددی به صورت زیر است :
در شکل بالا operand1 و operand2 می توانند یک عدد یا نام یک متغیر باشند و operator می تواند یکی از عملگر های بالا باشد.
در زیر مثالی برای نشان دادن نحوه ساخت عبارات عددی آورده شده است :
برای درک عبارات عددی در awk مثال زیر را در نظر میگیریم با فایلی به نام domains.txt که شامل همه ی دامین های مربوط به linux-zone.org می باشد :
برای مشاهده محتویات فایل از دستور زیر استفاده کنید :
اگر بخواهیم تعداد دفعاتی که دامین linux-zone.org در فایل وجود دارد را بشماریم می توانیم اسکریپت ساده ی زیر را بنویسیم :
بعد از ایجاد اسکریپت آنرا ذخیره کرده و به فایل اسکریپت پرمیژن اجرایی بدهید، وقتی که این اسکریپت را با فایل domains.txt اجرا می کنیم، خروجی زیر نمایش داده می شود :
در خروجی این اسکریپت 6 خط در فایل domains.txt وجود دارد که شامل linux-zone.org است، برای بررسی صحت عملکرد می توانید خطوط را به صورت دستی بشمارید.
3 - عملگر های انتساب (assignment operators)
آخرین ویژگی awk که به آن میپردازیم عملگرهای انتساب است، چندین عملگر از این نوع در awk وجود دارد که شامل لیست زیر است :
*= : multiplication assignment operator ( عملگر ضرب )
+= : addition assignment operator ( عملگر جمع )
/= : division assignment operator ( عملگر تقسیم )
-= : subtraction assignment operator ( عملگر تفریق )
%= : modulus assignment operator ( عملگر قدرمطلق )
^= : exponentiation assignment operator ( عملگر توان )
ساده ترین ساختار عملیات انتسابی (assignment operation) در Awk به این صورت است :
مثال :
شما می توانید از عمگرهای انتسابی بالا بمنظور کوتاه کردن عملیات assignment استفاده کنید، مثال قبل را در نظر بگیرید، می توانید عملیات را شبیه به فرم زیر انجام دهید :
بنابراین می توانیم دستور Awk را در Shell Script ی که در بالا نوشتیم با استفاده از عملگر += همانند زیر تغییر دهیم :
در این بخش از سری آموزش های دستور AWK، بعضی از ویژگی های قدرتمند Awk که شامل متغیر ها، ساخت Expression های عددی و نحوه استفاده از عملگرهای انتسابی است را به همراه نحوه استفاده از آنها را شرح دادیم.
این مفاهیم با آنچه در زبان های برنامه نویسی استفاده می شود متفاوت نیست اما ممکن است یک سری تفاوتهای ناچیزی در برنامه نویسی Awk وجود داشته باشد.
در بخش 9 از این سری مقالات درباره ی قابلیتهای بیشتر دستور awk که الگوهای خاص BEGIN و END هستند بحث خواهیم کرد. با ما همراه باشید.
با شروع این قسمت ما قصد داریم به مباحث پیشرفته ای در awk بپردازیم تا به توسط آن بتوانید عملیات پیشرفته فیلتر کردن متن یا string را انجام دهید، بنابراین ما قصد داریم که قابلیت های awk همانند متغیر ها (variables)، عبارت های عددی (numeric expressions) و عملگر های انتسابی (assignment operators) را پوشش دهیم.
مباحثی که در این جا مطرح می شود با آنچه شما در زبان های برنامه نویسی دیگر مانند Shell ،C ،Python، و بسیاری از زبان های دیگر مواجه میشوید به صورت گسترده متفاوت و مجزا نیست پس تیتر این مطلب شما را نگران نکند، ما به صورت ساده ویژگی هایی را که در بالا گفتیم را توضیح خواهیم داد.
این قسمت شاید یکی از آسانترین بخش های دستور awk باشد پس بشینید و ما را دنبال کنید :
1 - متغیر های AWK
در همه زبان های برنامه نویسی، یک متغیر (variable) جایی برای ذخیره کردن یک مقدار (value) است، زمانیکه شما یک متغیر در یک برنامه ایجاد میکنید، هنگامی که فایل را اجرا می کنید مقداری از فضا در حافظه کامپیوتر ایجاد شده و مقداری که شما برای متغیر در نظر گرفته اید را در آنجا ذخیره میشود.
متغیر های awk را به شیوه ای یکسان همانند متغیر های Shell و به شکل زیر می توانید تعریف کنید.
کد PHP:
variable_name=value
variable_name : نامی است که شما به یک متغیر میدهید.
value : مقداری است که در این متغیر ذخیره می شود.
حال بیاید به مثال بعدی نگاهی بیندازیم :
کد PHP:
computer_name=”linux-zone.org”
port_no=”22”
email=”support@linux-zone.org”
server=”computer_name”
علاوه بر این، مقدار 22 به متغیر port_no اختصاص یافته است، همچنین می توانید مقدار یک متغیر را به یک متغیر دیگر اختصاص دهید مانند مثال آخر که مقدار متغیر computer_name را به متغیر server اختصاص داده شده است.
اگر از قسمت دوم سری آموزش awk به یاد داشته باشید نحوه ویرایش field ها را پوشش داده ایم، و درباره اینکه چگونه دستور awk خطوط ورودی را درون field ها پخش می کند و از عملگر دسترسی به field استاندارد '$' که برای خواندن فیلد های متفاوت که به تازگی آنالیز شده اند، استفاده میشود بحث خواهیم کرد. همچنین می توانیم از متغیر ها برای ذخیره مقادیر field ها به صورتت زیر استفاده کنیم :
کد PHP:
first_name=$2
second_name=$3
برای روشن تر شدن مطلب، یک فایل به نام linuxzone.txt را در نظر بگیرید که شامل لیستی از کاربران یک نرم افزار است که دارای نام، نام خانوادگی و جنسیت است. با استفاده از دستور cat میتوانید محتویات این فایل را همانند زیر مشاهده کنیم.
کد PHP:
$ cat names.txt
همچنین می توانیم با استفاده از متغیرهای first_name و second_name نام و نام خانوادگی اولین کاربر در این لیست را با استفاده از کامند awk ذخیره کنیم :
کد PHP:
parham@parham:~$ awk '/Mohammad/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' linuxzone.txt parham@parham:~$
کد PHP:
parham@parham:~$ awk '/Mohammad/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' linuxzone.txt
Mohammad Habili
parham@parham:~$
فیلد دوم شامل hostname شماست، بنابراین می توانیم hostname را در یک متغیر به نام hostname ذخیره کنیم و آن را با awk همانند زیر نمایش دهیم :
کد PHP:
parham@parham:~$ uname -a
Linux parham 4.4.0-66-generic #87-Ubuntu SMP Fri Mar 3 15:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
parham@parham:~$
parham@parham:~$ uname -a | awk '{hostname=$2 ; print hostname ; }'
parham
parham@parham:~$
2- عبارت های عددی (Numeric Expressions)
در Awk عبارت های عددی با استفاده از عملگرهای عددی زیر ساخته شده اند.
* : multiplication operator ( عملگر ضرب )
+ : addition operator ( عملگر جمع )
/ : division operator ( عملگر تقسیم )
- : subtraction operator ( عملگر تفریق )
% : modulus operator ( عملگر قدرمطلق )
^ : exponentiation operator ( عملگر توان )
نحوه استفاده از Expression های عددی به صورت زیر است :
کد PHP:
$ operand1 operator operand2
در زیر مثالی برای نشان دادن نحوه ساخت عبارات عددی آورده شده است :
کد PHP:
counter=0
num1=5
num2=10
num3=num2-num1
counter=counter+1
کد PHP:
news.linux-zone.org
linux-zone.org
digium.ir
windows.linux-zone.org
linux-zone.org
news.linux-zone.org
linux-zone.org
digium.ir
linux-zone.org
news.linux-zone.org
linux-zone.org
digium.ir
windows.linux-zone.org
linux-zone.org
کد PHP:
$ cat domains.txt
اگر بخواهیم تعداد دفعاتی که دامین linux-zone.org در فایل وجود دارد را بشماریم می توانیم اسکریپت ساده ی زیر را بنویسیم :
کد PHP:
#!/bin/bash
for file in $@; do
if [ -f $file ] ; then
#print out filename
echo "File is: $file"
#print a number incrementally for every line containing linux-zone.org
awk '/^linux-zone.org/ { counter=counter+1 ; printf "%s\n", counter ; }' $file
else
#print error info incase input is not a file
echo "$file is not a file, please specify a file." >&2 && exit 1
fi
done
#terminate script with exit code 0 in case of successful execution
exit 0
کد PHP:
$ ./script.sh ~/domains.txt
در خروجی این اسکریپت 6 خط در فایل domains.txt وجود دارد که شامل linux-zone.org است، برای بررسی صحت عملکرد می توانید خطوط را به صورت دستی بشمارید.
3 - عملگر های انتساب (assignment operators)
آخرین ویژگی awk که به آن میپردازیم عملگرهای انتساب است، چندین عملگر از این نوع در awk وجود دارد که شامل لیست زیر است :
*= : multiplication assignment operator ( عملگر ضرب )
+= : addition assignment operator ( عملگر جمع )
/= : division assignment operator ( عملگر تقسیم )
-= : subtraction assignment operator ( عملگر تفریق )
%= : modulus assignment operator ( عملگر قدرمطلق )
^= : exponentiation assignment operator ( عملگر توان )
ساده ترین ساختار عملیات انتسابی (assignment operation) در Awk به این صورت است :
کد PHP:
$ variable_name=variable_name operator operand
مثال :
کد PHP:
counter=0
counter=counter+1
num=20
num=num-1
کد PHP:
variable_name operator=operand
کد PHP:
counter=0
counter+=1
num=20
num-=1
کد PHP:
#!/bin/bash
for file in $@; do
if [ -f $file ] ; then
#print out filename
echo "File is: $file"
#print a number incrementally for every line containing linux-zone.org
awk '/^linux-zone.org/ { counter+=1 ; printf "%s\n", counter ; }' $file
else
#print error info incase input is not a file
echo "$file is not a file, please specify a file." >&2 && exit 1
fi
done
#terminate script with exit code 0 in case of successful execution
exit 0
این مفاهیم با آنچه در زبان های برنامه نویسی استفاده می شود متفاوت نیست اما ممکن است یک سری تفاوتهای ناچیزی در برنامه نویسی Awk وجود داشته باشد.
در بخش 9 از این سری مقالات درباره ی قابلیتهای بیشتر دستور awk که الگوهای خاص BEGIN و END هستند بحث خواهیم کرد. با ما همراه باشید.