چگونگی استفاده از awk در اسکریپت نویسی bash

جزییات بازدید : 5785

تاریخ انتشار : 10 / تیر / 1397

چگونگی استفاده از awk در اسکریپت نویسی bash

چگونگی استفاده از awk در اسکریپت نویسی bash

امتیاز :      ( 4.5 / 5 - 25 نفر )

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{}

ترجمه : حسین داود

منبع :

https://www.cyberciti.biz/faq/bash-scripting-using-awk

ثبت نظر برای این مقاله
امتیاز دهید :
سوال امنیتی : مجموع عدد به علاوه عدد برابر است با : (به عدد وارد نمایید .)