ОҚ - AWK

ОҚ
ПарадигмаСценарий жазу, процессуалдық, деректерге негізделген[1]
ЖобалағанАльфред Ахо, Питер Вайнбергер, және Брайан Керниган
Бірінші пайда болды1977; 43 жыл бұрын (1977)
Тұрақты шығарылым
IEEE Std 1003.1-2008 (POSIX) / 1985 ж
Пәнді теружоқ; жолдармен, бүтін сандармен және өзгермелі нүктелермен жұмыс жасай алады; тұрақты тіркестер
ОЖКросс-платформа
Майор іске асыру
awk, GNU Awk, mawk, nawk, MKS AWK, Томпсон AWK (құрастырушы), Awka (құрастырушы)
Диалектілер
ескі аук Oawk 1977, жаңа аук Nawk 1985, GNU Awk шіркін
Әсер еткен
C, Сед, СНОБОЛ[2][3]
Әсер етті
Tcl, AMPL, Перл, Korn Shell (ksh93, дткш, ткш), Луа

ОҚЫ (awk)[4] Бұл доменге арналған тіл мәтінді өңдеуге арналған және әдетте а ретінде қолданылады деректерді шығару және есеп беру құралы. Ұнайды Сед және греп, Бұл сүзгі,[4] және көпшілігінің стандартты ерекшелігі болып табылады Unix тәрізді операциялық жүйелер.

AWK тілі - а деректерге негізделген сценарий тілі қарсы іс-қимылдар жиынтығынан тұрады ағындар мәтіндік мәліметтер - не файлдарда тікелей іске қосылады немесе a бөлігі ретінде қолданылады құбыр - форматты есептер шығару сияқты мәтінді шығару немесе түрлендіру мақсатында. Тіл кеңінен қолданады жіп деректер типі, ассоциативті массивтер (яғни кілт жолдарымен индекстелген массивтер), және тұрақты тіркестер. Әзірге AWK шектеулі қолданбалы домен және әсіресе қолдау үшін жасалған бір бағыттағы бағдарламалар, тіл Тюринг-аяқталған және тіпті Bell Labs-тің алғашқы пайдаланушылары AWK жиі жақсы құрылымдалған үлкен AWK бағдарламаларын жазды.[5]

AWK құрылған Bell Labs 1970 жылдары,[6][жақсы ақпарат көзі қажет ] және оның атауы тегі оның авторларының: Альфред Ахо, Питер Вайнбергер, және Брайан Керниган. Қысқарған сөз құспен бірдей айтылады аук, мұқабасында орналасқан AWK бағдарламалау тілі.[7] Барлық кіші әріптермен жазылған кезде awk, бұл туралы айтады Unix немесе Жоспар 9 AWK бағдарламалау тілінде жазылған сценарийлерді іске қосатын бағдарлама.

Тарих

Бастапқыда AWK 1977 жылы жасалған Альфред Ахо (авторы egrep ), Питер Дж. Вайнбергер (кішігірім реляциялық мәліметтер базасында жұмыс істеген) және Брайан Керниган; бұл олардың атын олардың бас әріптерінен алады. Керниганның пікірінше, AWK мақсаттарының бірі сандарды да, жолдарды да оңай басқаратын құралға ие болу болды.AWK шабыттандырды Марк Рохкинд Кіріс деректеріндегі заңдылықтарды іздеу үшін қолданылған және қолдану арқылы жүзеге асырылған бағдарламалау тілі yacc.[8]

Пайда болатын алғашқы құралдардың бірі ретінде 7-нұсқа Unix, AWK Unix-ке есептеу мүмкіндіктерін қосты құбыр Сонымен қатар Борн қабығы, Unix стандартты ортасында қол жетімді жалғыз сценарий тілі. Бұл.-Ның міндетті утилиталарының бірі Бірыңғай UNIX спецификациясы,[9] және талап етеді Linux стандартты базасы сипаттама.[10]

AWK 1985–88 жылдары айтарлықтай қайта қаралды және кеңейтілді, нәтижесінде GNU AWK іске асыру жазған Пол Рубин, Джей Фенласон, және Ричард Сталлман, 1988 жылы шыққан.[11] GNU AWK ең кең таралған нұсқасы болуы мүмкін[12] өйткені ол GNU негізіндегі Linux пакеттеріне енеді. GNU AWK тек қана қолдау көрсетеді Арнольд Роббинс 1994 жылдан бастап.[11] Брайан Керниган Келіңіздер жаңғақ (Жаңа AWK) дереккөз алғаш рет 1993 жылы жарияланбаған және 1990 жылдардың аяғынан бастап жарияланды; көптеген BSD жүйелері оны GPL лицензиясын болдырмау үшін пайдаланады.[11]

AWK алдында болды Сед (1974). Екеуі де мәтінді өңдеуге арналған. Олар желіге бағытталған, деректерге негізделген парадигманы бөліседі және жазуға ерекше қолайлы бір бағыттағы бағдарламалар, байланысты емес негізгі цикл және ағымдағы сызық айнымалылары. Ертедегі AWK бағдарламаларының қуаттылығы мен ұқыптылығы, атап айтқанда, бір реттік сызбаларды жеңілдететін айқын емес айнымалылардың әсерінен тұрақты экспрессті өңдеу және жинақтылық - сол кездегі AWK шектеулерімен бірге маңызды шабыт болды. Перл тіл (1987). 1990 жылдары Perl өте танымал болды, Unix мәтіндерін өңдеу тілдерінде AWK-мен бәсекелесті.

AWK бағдарламаларының құрылымы

AWK енгізілген жолды бір уақытта оқиды. Бағдарламадағы әр үлгі үшін сызық сканерленеді және сәйкес келетін әр үлгі үшін байланысты әрекет орындалады.

— Альфред В. Ахо[13]

AWK бағдарламасы дегеніміз:

жағдай { әрекет }жағдай { әрекет }...

қайда жағдай әдетте өрнек болып табылады және әрекет командалар қатары. Кіріс жазбаларға бөлінеді, мұнда әдепкі бойынша жазбалар жаңа жол символдарымен бөлінеді, осылайша енгізу жолдарға бөлінеді. Бағдарлама әрбір жазбаны шарттардың әрқайсысына сәйкес кезек-кезегімен тексереді және орындайды әрекет шындыққа сәйкес келетін әрбір өрнек үшін. Шарт немесе әрекет алынып тасталуы мүмкін. Шарт барлық жазбаларға сәйкес келеді. Әдепкі әрекет - жазбаны басып шығару. Бұл sed-пен бірдей үлгі-әрекет құрылымы.

Сияқты қарапайым AWK өрнегіне қосымша foo == 1 немесе / ^ foo /, жағдай болуы мүмкін БАСТА немесе СОҢЫ әрекеттің барлық жазбалар оқылғанға дейін немесе оқылғаннан кейін орындалуын тудыруы немесе өрнек1, өрнек2 сәйкес келетін жазбадан басталатын жазбалар диапазонына сәйкес келеді өрнек1 сәйкес келетін жазбаға дейін өрнек2 қайтадан қарсы ойнауға тырысады өрнек1 болашақ жолдарда.

AWK өрнектеріне қалыпты арифметикалық және логикалық операторлардан басқа, tilde операторы, ~, сәйкес келетін а тұрақты өрнек жіпке қарсы. Қолайлы синтаксистік қант, / regexp / tilde операторын қолданбай, ағымдағы жазбаға сәйкес келеді; бұл синтаксис келесіден шығады Сед, ол өз кезегінде оны ред редактор, қайда / іздеу үшін қолданылады. Қиғаш сызықтарды пайдалану синтаксисі бөлгіштер тұрақты тіркестер үшін кейіннен қабылданды Перл және ECMAScript, және қазір кең таралған. Тильда операторын Перл де қабылдаған.

Пәрмендер

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

The басып шығару команда

The басып шығару команда мәтін шығару үшін қолданылады. Шығарылатын мәтін әрқашан алдын-ала анықталған жолмен аяқталады, нәтиже жазбасын бөлгіш (ORS) деп аталады, оның әдепкі мәні жаңа жол болып табылады. Бұл команданың қарапайым түрі:

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

Бұл өрістер болғанымен ($ X) айнымалыларға ұқсас болуы мүмкін ($ белгісі айнымалыларды көрсетеді Перл ), олар іс жүзінде ағымдағы жазбаның өрістеріне сілтеме жасайды. Ерекше оқиға, $0, барлық жазбаға қатысты. Шындығында, командалар «басып шығару« және »$ 0 басып шығарыңыз«функционалдылығы бойынша бірдей.

The басып шығару команда есептеулердің нәтижелерін және / немесе функционалдық қоңырауларды көрсете алады:

/ regex_pattern / {    # Жазба (сызық) жоғарыдағы regex_ үлгісіне сәйкес келген жағдайда орындалатын әрекеттер    басып шығару 3+2    басып шығару foobar(3)    басып шығару foobar(айнымалы)    басып шығару күнә(3-2)}

Шығарманы файлға жіберуге болады:

/ regex_pattern / {    # Жазба (сызық) жоғарыдағы regex_ үлгісіне сәйкес келген жағдайда орындалатын әрекеттер    басып шығару «өрнек» > «файл атауы»}

немесе а құбыр:

/ regex_pattern / {    # Жазба (сызық) жоғарыдағы regex_ үлгісіне сәйкес келген жағдайда орындалатын әрекеттер    басып шығару «өрнек» | «бұйрық»}

Кірістірілген айнымалылар

Awk кіріктірілген айнымалыларына өрістің айнымалылары кіреді: $ 1, $ 2, $ 3 және т.с.с. ($ 0 бүкіл жазбаны білдіреді). Олар жеке мәтін өрістеріндегі мәтінді немесе мәндерді жазбада ұстайды.

Басқа айнымалыларға мыналар жатады:

  • NR: 'R'жазбалар саны': барлық деректер файлдарынан оқылған кіріс жазбаларының ағымдағы санын сақтайды. Ол нөлден басталады, бірақ ешқашан автоматты түрде нөлге қайтарылмайды.[14]
  • FNR: 'F'ile' 'R' жазбаларының саны: осы уақытқа дейін енгізілген жазбалар санының ағымдағы есебін жүргізеді ағымдағы файлда. Бұл айнымалы жаңа файлды бастаған сайын автоматты түрде нөлге қалпына келтіріледі.[14]
  • NF: 'Өрістердің' саны: ағымдағы енгізу жазбасындағы өрістердің санын қамтиды. Кіріс жазбасындағы соңғы өрісті $ NF, екіншіден өрісті $ (NF-1), үшіншіден өрісті $ (NF-2) және т.с.с. белгілеуге болады.
  • ФАЙЛ АТАУЫ: Ағымдағы кіріс-файлдың атын қамтиды.
  • FS: 'F'ield' S'eparator: енгізу жазбасында өрістерді бөлу үшін қолданылатын «өрісті бөлгіш» таңбасын қамтиды. Әдепкі «ақ бос орын» кез-келген бос орын мен қосымша белгілерді қамтиды. Өрісті бөлгішті өзгерту үшін FS басқа таңбаға ауыстырылуы мүмкін.
  • RS: 'R'ecord' S'eparator: ағымдағы «жазба бөлгіш» таңбасын сақтайды. Әдепкі бойынша кіріс сызығы кіріс жазбасы болғандықтан, жазбаны бөлгіштің шартты таңбасы «жаңа жол» болып табылады.
  • OFS: 'O'utput' F'ield 'S'eparator: Awk оларды басып шығарған кезде өрістерді бөлетін «шығыс өрісінің бөлгішін» сақтайды. Әдепкі бойынша «бос орын» таңбасы болады.
  • ORS: 'O'utput' R'ecord 'S'eparator: Awk оларды басып шығарған кезде шығыс жазбаларын бөлетін «шығыс жазбаларын бөлгішті» сақтайды. Әдепкі бойынша - «жаңа жол» таңбасы.
  • OFMT: 'O''пут' F'or'M'a'T ': сандық шығарудың пішімін сақтайды. Әдепкі формат - «% .6g».

Айнымалылар және синтаксис

Айнымалы атауларда тілдік кілт сөздерді қоспағанда, кез-келген таңбалар қолданыла алады [A-Za-z0-9_]. Операторлар + - * / сәйкесінше қосу, азайту, көбейту және бөлуді бейнелейді. Жіп үшін тізбектеу, жай екі айнымалыны (немесе жол тұрақтыларын) қатар орналастырыңыз. Егер жол константалары қатысатын болса, аралықты қолдану міндетті емес, бірақ бір-біріне іргелес орналастырылған екі айнымалы атаулар арасында бос орын қажет. Қос тырнақшалар шектеу жолдық тұрақтылар. Мәлімдемелер нүктелі үтірлермен аяқталмауы керек. Сонымен, бағдарламаларға түсініктемелерді қолдану арқылы қосуға болады # жолдағы бірінші таңба ретінде

Пайдаланушы анықтайтын функциялар

Форматына ұқсас C, функция анықтамалары кілт сөзден тұрады функциясы, функция атауы, аргумент атаулары және функция денесі. Міне, функцияның мысалы.

функциясы қосу_үш (нөмір) {    қайту нөмір + 3}

Бұл мәлімдемені келесі түрде жасауға болады:

(өрнек){   басып шығару қосу_үш(36)     # '' '39' '' нәтижелері}

Функциялар жергілікті ауқымда болатын айнымалыларға ие бола алады. Бұлардың аттары аргументтер тізімінің соңына қосылады, бірақ функцияны шақырған кезде олардың мәндері алынып тасталуы керек. Кейбіреулерін қосу конвенция бос кеңістік жергілікті айнымалылар алдында аргументтер тізімінде параметрлер қайда аяқталатынын және жергілікті айнымалылар басталатынын көрсету үшін.

Мысалдар

Сәлем Әлем

Міне әдет «Сәлем Әлем «AWK-да жазылған бағдарлама:

БАСТА { басып шығару «Сәлем Әлем!» }

Нақты екенін ескеріңіз Шығу бұл жерде мәлімдеме қажет емес; жалғыз үлгі болғандықтан БАСТА, пәрмен жолының аргументтері өңделмейді.

80 таңбадан асатын жолдарды басып шығарыңыз

Барлық жолдарды 80 таңбадан ұзын етіп басып шығарыңыз. Әдепкі әрекет ағымдағы жолды басып шығару екенін ескеріңіз.

ұзындығы($0) > 80

Сөздерді санау

Кірістегі сөздерді санап, жолдар, сөздер мен таңбалар санын басып шығарыңыз (сияқты) дәретхана ):

{    сөздер += NF    белгілер += ұзындығы + 1 # әрбір жазбаның (жолдың) соңында жаңа жол таңбасын есепке алу үшін біреуін қосу}СОҢЫ { басып шығару NR, сөздер, белгілер }

Бағдарламаның бірінші жолында ешқандай сызба болмағандықтан, енгізудің әр жолы әдепкі бойынша сәйкес келеді, сондықтан өсу әрекеттері әр жол үшін орындалады. Ескертіп қой сөздер + = NF стенография болып табылады сөздер = сөздер + NF.

Соңғы сөзді қосыңыз

{ с += $NF }СОҢЫ { басып шығару с + 0 }

с санының мәнімен көбейтіледі $ NF, бұл AWK өрісін бөлгішпен анықталған жолдағы соңғы сөз (әдепкі бойынша, бос орын). NF - ағымдағы жолдағы өрістер саны, мысалы. 4. бастап $4 төртінші өрістің мәні, $ NF - бұл жолдың қанша өрісі бар екеніне немесе оның қоршаған сызықтарға қарағанда өрісі аз немесе аз екендігіне қарамастан жолдағы соңғы өрістің мәні. $ іс жүзінде ең жоғарғысы бар бірыңғай оператор оператордың басымдығы. (Егер жолда өрістер болмаса, онда NF 0, $0 бұл бүкіл бос сызық, бұл жағдайда бос кеңістіктен басқа бос болады, сонымен қатар сандық мәні де 0 болады.)

Кіріс соңында СОҢЫ үлгі матчтары, сондықтан с басылған. Алайда, енгізу жолдары мүлдем болмағандықтан, бұл жағдайда ешқашан мән берілмеген с, ол әдепкіде бос жол болады. Айнымалыға нөл қосу - бұл жолдан сандық мәнге мәжбүрлеуге арналған AWK идиомасы. (Бос жолды біріктіру дегеніміз саннан жолға мәжбүрлеу, мысалы. «». Жолдарды біріктіретін оператор жоқ, олар тек іргелес орналасады.) Мәжбүрлеу кезінде бағдарлама бос кіріске «0» басып шығарады, онсыз бос жол басылады.

Кіріс жолдарының диапазонын сәйкестендіріңіз

NR % 4 == 1, NR % 4 == 3 { printf «% 6d% s«, NR, $0 }

Әрекет туралы мәлімдеме әрбір жолды нөмірлеп шығарады. Printf функциясы C стандартты эмуляциялайды printf және жоғарыда сипатталған басып шығару командасына ұқсас жұмыс істейді. Сәйкес келетін үлгі келесідей жұмыс істейді: NR - бұл жазбалардың саны, әдетте енгізу жолдары, AWK осы уақытқа дейін оқыды, яғни бірінші жол үшін 1-ден басталатын ағымдағы жол нөмірі. % болып табылады модуль оператор. NR% 4 == 1 1, 5, 9 және т.с.с., енгізу жолдарына қатысты. Сияқты, NR% 4 == 3 3, 7, 11 және т.с.с. енгізу жолдарына қатысты. Диапазон сызбасы бірінші бөлік сәйкес келгенге дейін жалған болып табылады, 1-жолда, содан кейін екінші бөлік сәйкес келгенге дейін 3-жолда да шын болып қалады, содан кейін бірінші бөлік 5-жолда қайтадан сәйкес келгенше жалған болып қалады.

Осылайша, бағдарлама 1,2,3 жолдарды басып шығарады, 4 жолды өткізіп жібереді, содан кейін 5,6,7 және т.с.с. Әрбір жол үшін ол жол нөмірін (6 таңбалық өрісте), содан кейін жолдың мазмұнын басып шығарады. Мысалы, осы кірісте орындалған кезде:

РимФлоренцияМиланНеапольТуринВенеция

Алдыңғы бағдарлама:

     1 Рим     2 Флоренция     3 Милан     5 Турин     6 Венеция

Файлдың бастапқы немесе соңғы бөлігін басып шығару

Ерекше жағдай ретінде, диапазон үлгісінің бірінші бөлігі үнемі шын болған кезде, мысалы. 1, ауқым кіріс басында басталады. Сол сияқты, егер екінші бөлік үнемі жалған болса, мысалы. 0, ауқым енгізу аяқталғанға дейін жалғасады. Мысалға,

 / ^ - осында кесу - $ /, 0

тұрақты жолға сәйкес келетін бірінші жолдан кіріс жолдарын басып шығарады ^ - мұнда кесу - $, яғни тек «- осында кесу -» тіркесін қамтитын жол, соңына дейін.

Сөз жиілігін есептеңіз

Сөз жиілігі қолдану ассоциативті массивтер:

БАСТА {    FS=«[^ a-zA-Z] +»}{    үшін (мен=1; мен<=NF; мен++)        сөздер[төмен($мен)]++}СОҢЫ {    үшін (мен жылы сөздер)        басып шығару мен, сөздер[мен]}

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

үшін (мен сөзбен)

массивтен өтетін цикл жасайды сөздер, параметр мен әрқайсысына индекс жиым. Бұл көптеген тілдерден өзгеше, өйткені мұндай цикл әрқайсысы арқылы өтеді мәні массивте. Осылайша цикл әр сөзді басып шығарады, содан кейін оның жиілігі есептеледі. төмен кітап шыққаннан кейін жасалған One True awk-қа қосымша болды (төменде қараңыз).

Пәрмен жолынан шаблонды сәйкестендіру

Бұл бағдарламаны бірнеше жолмен ұсынуға болады. Біріншісі Борн қабығы бәрін жасайтын қабықша сценарийін жасау. Бұл әдістердің ең қысқасы:

#! / bin / shөрнек="$1"ауысымawk '/'"$ өрнек"'/ {print FILENAME «:» $ 0}' "$@"

The $ өрнек awk пәрменінде жалғыз тырнақшалар қорғалмайды, сондықтан қабық айнымалыны кеңейтеді, бірақ бос орындары бар үлгілерді дұрыс өңдеу үшін қос тырнақшаға қою керек. Кәдімгі әдіс бойынша сызба бүкіл сызықтың бар-жоғын тексереді ($0) матчтар. ФАЙЛ АТАУЫ ағымдағы файл атын қамтиды. awk-тің нақты біріктіру операторы жоқ; екі көршілес жіп оларды біріктіреді. $0 бастапқы өзгермеген кіріс жолына дейін кеңейеді.

Мұны жазудың баламалы тәсілдері бар. Бұл қабықша сценарийі қоршаған ортаға awk ішінен тікелей қол жеткізеді:

#! / bin / shэкспорт өрнек="$1"ауысымawk '$ 0 ~ ENVIRON [«pattern»] {print FILENAME «:» $ 0}' "$@"

Бұл пайдаланатын қабықша сценарийі ENVIRON, кітап шыққаннан кейін One True awk-тың жаңа нұсқасында енгізілген массив. Индексі ENVIRON - қоршаған ортаның айнымалысының атауы; оның нәтижесі - айнымалының мәні. Бұл сияқты гетенв әр түрлі стандартты кітапханалардағы функция және POSIX. Shell сценарийі қоршаған ортаны айнымалы етеді өрнек бірінші аргументті қамтитын, содан кейін осы аргументті түсіреді және әр файлдағы үлгіні іздейді.

~ оның сол операнты оның оң операндына сәйкес келетіндігін тексереді; !~ оның кері мәні. Тұрақты өрнек тек жол екенін және айнымалыларда сақталатынын ескеріңіз.

Келесі жол пәрмен жолының айнымалы тағайындауын қолданады, мұндағы аргумент айнымалыға тағайындау ретінде қарастырылуы мүмкін:

#! / bin / shөрнек="$1"ауысымawk '$ 0 ~ өрнек {print FILENAME «:» $ 0}' «үлгі =$ өрнек" "$@"

Немесе сіз -v var = мән командалық жол опциясы (мысалы, awk -v үлгісі = «$ үлгісі» ...).

Ақырында, бұл қабықшаның көмегінсіз немесе awk сценарийінің орындалуы туралы көп білуді қажет етпестен, таза awk түрінде жазылған (командалық жолдағы айнымалы тағайындау сияқты), бірақ сәл ұзын:

БАСТА {    өрнек = ARGV[1]    үшін (мен = 1; мен < ARGC; мен++) # бірінші аргументті алып тастаңыз        ARGV[мен] = ARGV[мен + 1]    ARGC--    егер (ARGC == 1) { # өрнек жалғыз нәрсе болды, сондықтан стандартты кірістен оқылуға мәжбүр болды (кітапта қолданылады)        ARGC = 2        ARGV[1] = "-"    }}$0 ~ өрнек { басып шығару ФАЙЛ АТАУЫ ":" $0 }

The БАСТА бірінші аргументті шығарып қана қоймай, сонымен қатар оны файл аты ретінде түсіндіруге жол бермеу үшін қажет БАСТА блоктың ұштары ARGC, аргументтер саны әрқашан ≥1, кепілдендірілген ARGV [0] - бұл сценарийді орындаған команданың аты, көбінесе жол «awk». Сондай-ақ, назар аударыңыз ARGV [ARGC] бұл бос жол, "". # жолдың соңына дейін кеңейтілетін түсініктеме бастайды.

Назар аударыңыз егер блок. awk команданы орындамас бұрын оның стандартты кірістен оқылуы керектігін тексереді. Бұл дегеніміз

awk 'prog'

тек жұмыс істейді, өйткені файл атаулары жоқ екендігі тек бұрын тексеріледі прог іске қосылды! Егер сіз нақты орнатсаңыз ARGC 1-ге ешқандай аргумент болмас үшін, awk жұмысын тоқтатады, өйткені енді кіріс файлдары жоқ деп санайды. Сондықтан сізге арнайы файл атауымен стандартты кірістен оқуды нақты айту керек -.

Автономды AWK сценарийлері

Unix тәрізді операциялық жүйелерде дербес AWK сценарийлерін шебанг синтаксис.

Мысалы, берілген файлдың мазмұнын басып шығаратын сценарий аталған файлды құру арқылы жасалуы мүмкін басып шығару келесі мазмұнмен:

#! / usr / bin / awk -f{ басып шығару $0 }

Оны келесі арқылы шақыруға болады: ./print.awk <файл аты>

The -f AWK-ге келесі аргумент - бұл AWK бағдарламасын оқуға арналған файл, ол sed-де қолданылатын бірдей жалауша екенін айтады. Олар көбінесе бір лайнерлер үшін қолданылатындықтан, бұл екі бағдарлама да жеке файлға емес, командалық жол аргументі ретінде берілген бағдарламаны орындайды.

Нұсқалар және іске асыру

AWK бастапқыда 1977 жылы жазылған және таратылған 7-нұсқа Unix.

1985 жылы оның авторлары тілді кеңейтуді, ең бастысы, қолданушы анықтайтын функцияларды қосу арқылы бастады. Тіл кітапта сипатталған AWK бағдарламалау тілі, 1988 жылы жарық көрді және оны жүзеге асыру релиздерде қол жетімді болды UNIX жүйесі V. Сәйкес келмейтін ескі нұсқамен шатастырмау үшін бұл нұсқаны кейде «жаңа авк» немесе жаңғақ. Бұл іске асыру а. Астында шығарылды бағдарламалық жасақтаманың ақысыз лицензиясы 1996 жылы және оны әлі күнге дейін Брайан Керниган қолдайды (төмендегі сыртқы сілтемелерді қараңыз).[дәйексөз қажет ]

Сияқты Unix-тің ескі нұсқалары UNIX / 32V, енгізілген awkcc, AWK-ны C.-ге ауыстырған Керниган awk-ты C ++ түріне айналдыратын бағдарлама жазды; оның күйі белгісіз.[15]

  • BWK awk, сондай-ақ жаңғақ, нұсқасына сілтеме жасайды Брайан Керниган. Терминнің бастапқыда тілді сипаттаған кітаппен бірге қолданылғандығына және Керниганның AWK-ның алғашқы авторларының бірі болғандығына байланысты «Бір шынайы AWK» деп аталды.[7] FreeBSD бұл нұсқаға сілтеме жасайды бір-шын-ау.[16] Бұл нұсқада кітапта жоқ ерекшеліктер бар, мысалы төмен және ENVIRON жоғарыда түсіндірілгендер; Мәліметтер алу үшін бастапқы мұрағаттағы FIXES файлын қараңыз. Бұл нұсқаны мысалы қолданады Android, FreeBSD, NetBSD, OpenBSD, macOS, және иллюмо. Брайан Керниган мен Арнольд Роббинс - дереккөздің қоймасына негізгі салымшылар жаңғақ: github.com/ onetrueawk/ awk.
  • шіркін (GNU awk) - бұл ақысыз бағдарламалық жасақтаманың тағы бір қосымшасы және оны іске асыруда елеулі жетістіктерге жететін жалғыз бағдарлама интернационализация және локализация және TCP / IP желілері. Ол түпнұсқа енгізу еркін қол жетімді болғанға дейін жазылған. Оған өзінің жөндеушісі және оның профиль жасаушы пайдаланушыға сценарий бойынша өлшенген өнімділікті жақсартуға мүмкіндік береді. Бұл пайдаланушыға функционалдылықты ортақ кітапханалармен кеңейтуге мүмкіндік береді. Кейбіреулер Linux таратылымдары қосу шіркін олардың әдепкі AWK орындалуы ретінде.[дәйексөз қажет ]
    • gawk-csv. The CSV кеңейту шіркін CSV форматталған деректерді енгізу және шығару үшін құралдар ұсынады.[17]
  • маук a негізінде Майк Бреннан жасаған өте тез AWK-ны жүзеге асыру байт коды аудармашы.
  • libmawk бұл қосымшаларға awk аудармашыларының бірнеше параллель даналарын енгізуге мүмкіндік беретін mawk шанышқысы.
  • awka (оның алдыңғы жағы жоғарғы жағында жазылған маук program) - бұл AWK сценарийлерінің басқа C кодына аудармашысы. Автордың libawka.a-ны қоса алғанда, статикалық түрде жинақталған кезде, орындалатын файлдар айтарлықтай жылдамдатады және авторлық тестілерге сәйкес AWK басқа нұсқаларымен өте жақсы салыстырылады, Перл, немесе Tcl. Шағын сценарийлер 160-170 кБ бағдарламаларға айналады.
  • бағдар (Томпсон AWK) - бұл AWK құрастырушы үшін Solaris, DOS, OS / 2, және Windows, бұрын Томпсон Автоматтандыру Бағдарламасымен сатылған (өз қызметін тоқтатқан).[18]
  • Джек - бұл AWK-ны іске асыруға арналған жоба Java, SourceForge сайтында орналастырылған.[19] AWK сценарийлеріндегі Java мүмкіндіктеріне қол жетімділікті қамтамасыз ету үшін тілге кеңейтімдер қосылады (яғни, Java ағындары, розеткалар, коллекциялар және т.б.).
  • xgawk шанышқысы шіркін[20] ол созылады шіркін динамикалық жүктелетін кітапханалармен. XMLgawk кеңейтімі GNU Awk 4.1.0 ресми шығарылымына біріктірілген.
  • QSEAWK бұл QSE кітапханасына енгізілген, енгізуді қамтамасыз ететін AWK интерпретаторының ендірілген бағдарламасы қолданбалы бағдарламалау интерфейсі Үшін (API) C және C ++.[21]
  • libfawk - бұл өте кішкентай, тек функционалды, қайта қаралатын, енгізілетін аудармашы, С тілінде жазылған
  • BusyBox Дмитрий Захаров жазған AWK бағдарламасын қамтиды. Бұл ендірілген жүйелер үшін өте ыңғайлы бағдарлама.

Кітаптар

  • Ахо, Альфред В.; Керниган, Брайан В.; Вайнбергер, Питер Дж. (1988-01-01). AWK бағдарламалау тілі. Нью-Йорк, Нью-Йорк: Аддисон-Уэсли. ISBN  0-201-07981-X. Алынған 2017-01-22.
  • Роббинс, Арнольд (2001-05-15). Тиімді бағдарламалау (3-ші басылым). Себастополь, Калифорния: O'Reilly Media. ISBN  0-596-00070-7. Алынған 2009-04-16.
  • Догерти, Дейл; Роббинс, Арнольд (1997-03-01). sed & awk (2-ші басылым). Себастополь, Калифорния: О'Рейли Медиа. ISBN  1-56592-225-5. Алынған 2009-04-16.
  • Роббинс, Арнольд (2000). Тиімді Awk бағдарламалау: Gnu Awk үшін пайдаланушы нұсқаулығы (1.0.3 басылым). Блумингтон, IN: iUniverse. ISBN  0-595-10034-1. Мұрағатталды түпнұсқадан 2009 жылғы 12 сәуірде. Алынған 2009-04-16.

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ Штутц, Майкл (19 қыркүйек 2006). «GAWK: AWK тілінің негіздері» (PDF). developerWorks. IBM. Алынған 2015-01-29. [AWK] көбінесе деректерге негізделген тіл деп аталады - бағдарлама мәлімдемелері бағдарлама қадамдарының реттілігінен гөрі сәйкес келетін және өңдейтін мәліметтерді сипаттайды
  2. ^ Пилавакис Андреас (1989). UNIX шеберханасы. Макмиллан халықаралық жоғары білім. б. 196.
  3. ^ Арнольд Роббинс (2015). Тиімді Awk бағдарламалау: әмбебап мәтінді өңдеу және үлгіні сәйкестендіру (4-ші басылым). O'Reilly Media. б. 560.
  4. ^ а б Джеймс В.Ливингстон (1988 ж. 2 мамыр). «Ұлы awk бағдарламасы - бұл құстың миы емес». Сандық шолу. б. 91.
  5. ^ Раймонд, Эрик С. «Тілдерді қолдану». Unix бағдарламалау өнері. Кейс-стади: awk. Архивтелген түпнұсқа 30 шілде 2008 ж. Алынған 11 мамыр, 2010. Awk әрекет тілі тюринг-толық, және файлдарды оқи және жаза алады.
  6. ^ Ахо, Альфред В.; Керниган, Брайан В.; Вайнбергер, Питер Дж. (1978 ж. 1 қыркүйегі). Awk - Үлгіні сканерлеу және өңдеу тілі (екінші басылым) (Техникалық есеп). Unix Seventh Edition нұсқаулығы, 2-том. Bell Telephone Laboratories, Inc.
  7. ^ а б Ахо, Альфред V .; Керниган, Брайан В. Уайнбергер, Питер Дж. (1988). AWK бағдарламалау тілі. Addison-Wesley Publishing Company. ISBN  9780201079814. Алынған 16 мамыр 2015.
  8. ^ «UNIX Special: Профессор Керниган және Брайлсфорд». Компьютерлік файл. 2015 жылғы 30 қыркүйек.
  9. ^ «Бірыңғай UNIX спецификациясы, 3-нұсқа, утилиталар интерфейсінің кестесі». Архивтелген түпнұсқа 2018-01-05. Алынған 2005-12-18.
  10. ^ «15-тарау. Пәрмендер және утилиталар». Linux стандартты базалық ядросының спецификациясы 4.0 (Техникалық есеп). Linux Foundation. 2008 ж.
  11. ^ а б c Роббинс, Арнольд (наурыз 2014). «GNU жобасы және мен: 27 жыл GNU AWK-мен» (PDF). skeeve.com. Алынған 4 қазан, 2014.
  12. ^ Догерти, Дейл; Роббинс, Арнольд (1997). sed & awk (2-ші басылым). Себастополь, Калифорния: О'Рейли. б. 221. ISBN  1-565-92225-5.
  13. ^ Гамильтон, Наоми (30 мамыр, 2008). «Бағдарламалау тілдерінің A-Z: AWK». Computerworld. Алынған 2008-12-12.
  14. ^ а б https://www.gnu.org/software/gawk/manual/html_node/Records.html#index-FNR-variable
  15. ^ Керниган, Брайан В. (1991 ж. 24-25 сәуір). C ++ аудармашысына AWK (PDF). Usenix C ++ конференциясы. Вашингтон, ДС. 217–228 бб.
  16. ^ «FreeBSD-тің BWK файлын FreeBSD ядросына импорттауға арналған жұмыс журналы». 2005 жылғы 16 мамыр. Мұрағатталды түпнұсқасынан 2013 жылдың 8 қыркүйегінде. Алынған 20 қыркүйек, 2006.
  17. ^ gawk-csv құжаттама http://gawkextlib.sourceforge.net/csv/gawk-csv.html
  18. ^ Джеймс К. Лоулесс (1997 ж. 1 мамыр). «TAWK құрастырушысын зерттеу». Доктор Доббтың журналы.
  19. ^ Джек SourceForge-де
  20. ^ xgawk Басты бет
  21. ^ GSEHW-те QSEAWK

Әрі қарай оқу

Сыртқы сілтемелер