Awk пәрменімен жұмысты бастау


Awk — әрбір дерлік *nix жүйесіне енгізілген деректерді өңдеудің қуатты бағдарламалау тілі. Ол сырттай жалпы мақсаттағы бағдарламалау тіліне ұқсайды, бірақ ол енгізуді қабылдауға және сол енгізуге негізделген әрекеттерді орындауға арналған. Белгілі бір шарттар негізінде мәтінді өңдеу қажет болса, awk әрқашан дерлік C сияқты жалпы мақсаттағы тілге қарағанда жұмысты тезірек орындайды. Ол да түсіндіріледі, осылайша сіз құрастырылған тілдердің ұзаққа созылған компиляция және жөндеу процесіне жол бермейсіз.

Ерекше қызық факт: бағдарламаның тақ атауы оның бағдарламашыларының есімдерінің инициализмі болып табылады: АльфредАхо, ПитерВайнбергер және БрайанҚерниган

Awk негізгі синтаксисі

Пәрмен жолында шақырылған кезде, awk төмендегі негізгі үлгіні орындайды:

pattern { action } file
pattern { action } file
...

Awk әрекетті үлгі көрсетілген файл ішінде сәйкестендіргенде орындайды. Егер файлды көрсетпесеңіз, awk стандартты шығыста іске қосылады. Үлгілерді сәйкестендіру кезінде awk тұрақты өрнектерді де, бағдарламалық енгізуді де қабылдай алады. Төмендегі негізгі мысалды қарастырайық:

awk '/com/ { print $0 }' emails

Бұл бір жолды бағдарлама com таңбалары бар "emails" файлының әрбір жолын басып шығарады. awk $0 ағымдағы жолды білдіреді, ол да әдепкі әрекет болып табылады. Жолды $0,сыз жазуға болады және ол бірдей жұмыс істейтін еді.

Басып шығару өрістері

awk өріс бөлгіштерін анықтап, талдай алатындықтан, ол деректердің белгілі бір бағандарын немесе жолдарын басып шығару үшін пайдалы. Бұл мысал үшін біз "/etc/passwd" файлын қолданамыз.

awk -F":" '{ print $1 }' /etc/passwd

Бұл бір жолды бағдарлама бірнеше нәрсені жасайды. -F жалаушасы келесі таңбаны (осы мысалдағы :) өріс бөлгіші ретінде түсіндіру керек екенін көрсетеді. Awk олар $1 арқылы көрсетілген бірінші өрісті басып шығарады.

Сондай-ақ өрістерді ретімен көрсету арқылы бір уақытта бірнеше өрісті басып шығаруға болады:

awk -F":" '{ print $4 " " $5}' /etc/passw

Ол төмендегідей нәтиже береді.

Бұл passwd файлының төртінші және бесінші өрістерін олардың арасындағы бос орынмен басып шығарады. Бос орын қос тырнақшалардың арасында екенін ескеріңіз. Бұл оны басып шығару пәрменіндегі әріптік таңба ретінде көрсетеді, сондықтан ол жазылғандай басып шығарылады. Сондай-ақ, нәтижені тазалау үшін күрделі литералдарды қосуға болады:

awk -F":" '{ print "process: " $5 "\t\t " "directory: "$6}' /etc/passwd

Бұл сәйкестендіру үшін жапсырмалары бар шығысты басып шығарады. Осының барлығын каретка (>) арқылы жаңа файлға шығара аламыз.

awk -F":" '{ print "process: " $5 "\t\t " "directory: "$6}' /etc/passwd > processes.txt

Біз деректерді кеңінен өңдеу үшін осы уақытқа дейін білетінімізді біріктіре аламыз. Мысалы, жарамды АҚШ телефон нөмірі бар құжаттың барлық жолдарын басып шығару үшін тұрақты өрнектерді пайдалана аламыз.

awk '/^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$/ { print }' contacts

Awk пәрменінің сәйкестік қуатын кеңейту

Awk сонымен қатар әртүрлі операндтарды пайдаланып ақпаратты өңдей алады. Бұған ==, <, >, <=, >= сияқты стандартты операндтар кіреді. , және !=, сондай-ақ awk-арнайы операндтар ~ және !~, "сәйкес келеді" және "сәйкес емес" дегенді білдіреді тиісінше. Бұл операндтар логикалық логикамен тұрақты өрнектерді, сондай-ақ стандартты программалық фразаларды салыстыру кезінде қолданылады.

Awk пәрменінің мысалдары

awk 'length($0) > 80' data

"Деректер" файлындағы сексен таңбадан асатын барлық жолдарды басып шығарады. Басып шығару мәлімдемесінің жоқтығына назар аударыңыз: көрсетілген әрекет болмаған жағдайда, awk үлгі сәйкес келген сайын толық жолды басып шығарады.

$1 == "user" { print }

Бірінші өріс «пайдаланушы» жолына тең болатын барлық жолдарды басып шығарады. -F жалауы болмаса, awk әдепкі өріс бөлгіші ретінде бос орынды пайдаланады. Сондай-ақ, awk және файл көрсетілмегенін ескеріңіз. Бұл төменде қарастырылғандай бөлек файлдардағы сценарийлерде пайдалануға арналған.

$5 ~ /root/ { print $3 }

Бесінші өріс /root/ тұрақты өрнекке сәйкес келген сайын үшінші өрісті басып шығарады.

{ 
  if ( $5 !~ /root/ ) { 
          print $3 
  } 
}

5 өрісі /root/ сәйкес келмесе, үшінші өрісті басып шығарыңыз. Бұл C тәрізді if операторын пайдаланады, ол awk-мен де үйлесімді. Бұл формат жалпы мақсаттағы тілдермен таныс бағдарламашыларға көбірек икемділікке мүмкіндік береді.

Файлдарда сценарийлерді сақтау

Awk сценарийлерін күрделірек бағдарламаларды сақтауға мүмкіндік беретін файлдарда да сақтауға болады:

awk -f ~/scripts/program.awk data

-f жалауын пайдаланған кезде, awk сценарийді көрсетілген файл жолында іске қосады, атап айтқанда program.awk. Бұл бағдарламадағы пәрмендер «деректер» файлын өңдейді.

Әрекеттерді BEGIN және END арқылы бағдарламаға дейін және кейін де орындауға болады:

BEGIN { FS=":" } # indicates that : is the field separator for the program.
 
#operations
 
END   { print "You're done" } # prints a joyful message for the user

Жоғарыда көріп отырғаныңыздай, # таңбасы жолдың соңына дейін созылатын түсініктемені бастайды.

Қорытынды

Бұл нұсқаулық awk-тың ең негізгі элементтерін ғана қозғайды. Бұдан басқа да құру және зерттеу керек. awk немесе Awk бағдарламалау тілі үшін GNU құжаттамасын және бағдарламаны әзірлеушілер жазған awk оқулығын қараңыз.