جزییات بازدید : 5779
تاریخ انتشار : 10 / تیر / 1397
Awk ابزاری فوق العاده برای اسکریپت نویسی شل در یونیکس و لینوکس می باشد. AWK یک زبان برنامه نویسی است که برای دیتاهای متنی ، فایلها ، دیتا استریم ها و یا استفاده در piping ها طراحی شده است . به عبارت دیگر شما میتوانید awk را با شل اسکریپت ها ترکیب کرده و یا مستقیم در خط فرمان از آن استفاده نمایید.
در این مقاله نحوه استفاده از awk در شل اسکریپت bash را نشان می دهیم.
Awk ابزاری فوق العاده برای اسکریپت نویسی شل در یونیکس و لینوکس می باشد. AWK یک زبان برنامه نویسی است که برای دیتاهای متنی ، فایلها ، دیتا استریم ها و یا استفاده در piping ها طراحی شده است . به عبارت دیگر شما میتوانید awk را با شل اسکریپت ها ترکیب کرده و یا مستقیم در خط فرمان از آن استفاده نمایید.
در این مقاله نحوه استفاده از awk در شل اسکریپت bash را نشان می دهیم.
چاپ یک فایل متنی
awk '{ print }' /etc/passwd
یا
awk '{ print $0 }' /etc/passwd
چاپ فیلد خاص
از : به عنوان جدا کننده استفاده کنید و فیلد اولی را فقط چاپ کنید یعنی نام کاربری ها
awk -F':' '{ print $1 }' /etc/passwd
ارسال خروجی به دستور sort با استفاده از pipe
awk -F':' '{ print $1 }' /etc/passwd | sort
Pattern Matching
شما میتوانید فقط خطوطی را چاپ کنید که با الگو مطابقت دارد. به عنوان مثال نمایش تمام خطوط فایل لاگ آپاچی که کد خطای HTTP 500 دارد به شکل زیر میتوان به دست آورد
awk '$9 == 500 { print $0}' /var/log/httpd/access.log
بخش خارجی باکت ها با نام pattern و بخش داخلی با نام action شناخته می شود.عملگرهای مقایسه ای مشابه عملکرهای زبان C هستند:
== != < > <= >= ?:
چنانچه هیچ الگویی وجود نداشته باشد action به همه خطوط اعمال می شود . چنانچه هیچ action داده نشود بنابراین تمام خط چاپ میشود. چنانچه “print” به تنهایی مورد اشتفاده قرار گیرد تمام خط چاپ می شود . بنابراین هر سه عبارت زیر مشابه هم هستند:
awk '$9 == 500 ' /var/log/httpd/access.log
awk '$9 == 500 {print} ' /var/log/httpd/access.log
awk '$9 == 500 {print $0} ' /var/log/httpd/access.log
چاپ خطوطی که شامل tom ، jerry و vivek هستند
چاپ الگو احتمالا در خطوط جداگانه :
awk '/tom|jerry|vivek/' /etc/passwd
چاپ اولین خط از فایل
awk "NR==1{print;exit}" /etc/resolv.conf
awk "NR==$line{print;exit}" /etc/resolv.conf
محاسبه ساده
شما میتوانید مجموع تمامی اعداد یک ستون را به دست آورید
awk '{total += $1} END {print total}' earnings.txt
شل نمیتواند اعداد اعشار را محاسبه کند ولی awk می تواند:
awk 'BEGIN {printf "%.3f\n", 2005.50 / 3}'
فراخوانی AWK از شل اسکریپت
یک شل اسکریپت که تمامی IP هایی که وب سایت شما را بازدید کردند لیست می کند. این اسکریپت از awk برای پردازش فایلهای لاگ با کمک دستورات شل استفاده می کند
#!/bin/bash
d=$1
OUT=/tmp/spam.ip.$$
HTTPDLOG="/www/$d/var/log/httpd/access.log"
[ $# -eq 0 ] && { echo "Usage: $0 domain-name"; exit 999; }
if [ -f $HTTPDLOG ];
then
awk '{print}' $HTTPDLOG >$OUT
awk '{ print $1}' $OUT | sort -n | uniq -c | sort -n
else
echo "$HTTPDLOG not found. Make sure domain exists and setup correctly."
fi
/bin/rm -f $OUT
AWK و توابع شل
chrootCpSupportFiles() کتابخانه های اشتراکی مورد نیاز هر برنامه (مانند perl / php-cgi ( و یا کتابخانه اشتراکی مشخص شده در خط فرمان را جستجو میکند و آنها را در مقصد کپی میکنتد. این کد awk را برای چاپ فیلدهای انتخاب شده از خروجی ldd فراخوانی می کند:
chrootCpSupportFiles() {
# Set CHROOT directory name
local BASE="$1" # JAIL ROOT
local pFILE="$2" # copy bin file libs
[ ! -d $BASE ] && mkdir -p $BASE || :
FILES="$(ldd $pFILE | awk '{ print $3 }' |egrep -v ^'\(')"
for i in $FILES
do
dcc="$(dirname $i)"
[ ! -d $BASE$dcc ] && mkdir -p $BASE$dcc || :
/bin/cp $i $BASE$dcc
done
sldl="$(ldd $pFILE | grep 'ld-linux' | awk '{ print $1}')"
sldlsubdir="$(dirname $sldl)"
if [ ! -f $BASE$sldl ];
then
/bin/cp $sldl $BASE$sldlsubdir
else
:
fi
}
این تابع به شکل زیر فراخوانی میشود :
chrootCpSupportFiles /lighttpd-jail /usr/local/bin/php-cgi
AWK و Shell pipe
لیست 10 دستور پر استفاده شما
history | awk '{print $2}' | sort | uniq -c | sort -rn | head
خروجی ساده :
172 ls
144 cd
69 vi
62 grep
41 dsu
36 yum
29 tail
28 netstat
21 mysql
20 cat
مثال دیگری برای جستجوی تاریخ انقضای دامنه :
$ whois 3dots.ir | awk '/Registry Expiry Date:/ { print $4 }'
خروجی ساده :
2018-07-31T18:42:58Z
Awk Program File
شما می توانید تمامی دستورات awk را در یک فایل بگذارید و آن را به شیوه زیر فراخوانی نمایید
awk -f mypgoram.awk input.txt
awk در شل اسکریپت – ارسال متغیرات شل به AWK
شما میتوانید متغیرهای شل را با استفاده از آپشن –v ارسال نمایید .
n1=5
n2=10
echo | awk -v x=$n1 -v y=$n2 -f program.awk
مقدارnl را به متغیر x نسبت دهیدقبل از اینکه برنامه آغاز شود . برخی مقادیر متغیرها در بلاک BEGIN یک برنامه AWK در دسترس هستند
BEGIN{ans=x+y}
{print ans}
END{}
ترجمه : حسین داود
منبع :