Како се користи команда авк на Линуку

На Линуку,авк је динамо за манипулацију текстом у командној линији, као и моћан скриптни језик. Ево увода у неке од његових најлепших карактеристика.

Хов авк Гот Ит Наме

Тхеавк команда именована је иницијалима тројице људи који су оригиналну верзију написали 1977. године: Алфреда Ахоа, Петера Веинбергера и Бриана Кернигхан-а. Ова тројица су била из легендарног АТ&Т Белл Лабораториес Уник пантеона. Уз допринос многих других од тада, авк је наставио да се развија.

То је потпун језик скриптирања, као и комплетан сет алата за манипулацију текстом за командну линију. Ако вам овај чланак изазива апетит, можете погледати све детаље о томеавк и његову функционалност.

Правила, обрасци и радње

авк ради на програмима који садрже правила која се састоје од образаца и радњи. Акција се извршава на тексту који одговара обрасцу. Обрасци су затворени у витичасте заграде ({}). Заједно образац и акција чине правило. Цела авк програм је приложен у једноструким наводницима (').

Погледајмо најједноставнији тип авк програм. Нема образац, тако да одговара сваком ретку текста који је у њега унет. То значи да се акција извршава на свакој линији. Користићемо га на излазу из СЗО команда.

Ево стандардног излаза из СЗО:

СЗО

Можда нам нису потребне све те информације, већ само желимо да видимо имена на рачунима. Можемо усмјерити излаз из СЗО у авк, а затим реци авк да одштампа само прво поље.

Подразумевано, авк сматра да је поље низ знакова окружен размаком, почетак реда или крај реда. Поља су идентификована знаком долара ($) и број. Тако,$1 представља прво поље које ћемо користити са штампати акција за испис првог поља.

Куцамо следеће:

ко | авк '{принт $ 1}'

авк исписује прво поље и одбацује остатак реда.

Можемо да одштампамо онолико поља колико желимо. Ако додамо зарез као сепаратор,авк исписује размак између сваког поља.

Укуцавамо следеће да бисмо такође одштампали време када се особа пријавила (поље четири):

ко | авк '{принт $ 1, $ 4}'

Постоји неколико посебних идентификатора поља. Они представљају цео ред текста и последње поље у реду текста:

  • $0: Представља цео ред текста.
  • $1: Представља прво поље.
  • $2: Представља друго поље.
  • $7: Представља седмо поље.
  • $45: Представља 45. поље.
  • $ НФ: Означава „број поља“ и представља последње поље.

Укуцаћемо следеће да бисмо отворили малу текстуалну датотеку која садржи кратки цитат приписан Деннису Ритцхиеју:

мачка деннис_ритцхие.ткт

Ми желимоавк за испис првог, другог и последњег поља цитата. Имајте на уму да, иако је омотан у прозору терминала, то је само један ред текста.

Укуцавамо следећу команду:

авк '{принт $ 1, $ 2, $ НФ}' деннис_ритцхие.ткт

Не знамо ту „једноставност“. је 18. поље у реду текста и није нас брига. Оно што знамо је да је последње поље и можемо да користимо $ НФ да би се добила његова вредност. Период се само сматра још једним ликом у телу поља.

Додавање сепаратора излазних поља

Такође можете рећи авк за испис одређеног знака између поља уместо подразумеваног размака. Подразумевани излаз издатум команда је мало необична јер је време одвојено усред ње. Међутим, можемо откуцати следеће и користити авк да издвојимо поља која желимо:

датум
датум | авк '{принт $ 2, $ 3, $ 6}'

Користићемо ОФС (сепаратор излазног поља) променљива за постављање сепаратора између месеца, дана и године. Имајте на уму да у наставку команду стављамо у појединачне наводнике ('), а не коврџаве заграде ({}):

датум | авк 'ОФС = "/" {принт $ 2, $ 3, $ 6}'
датум | авк 'ОФС = "-" {принт $ 2, $ 3, $ 6}'

Правила БЕГИН и ЕНД

А. ПОЧЕТИ правило се извршава једном пре него што започне било која обрада текста. У ствари, извршавало се и раније авк чак и чита било који текст. Ан КРАЈ правило се извршава након завршетка све обраде. Можете их имати више ПОЧЕТИ иКРАЈ правила и извршаваће се редом.

За наш пример а ПОЧЕТИ правило, одштампаћемо цео цитат из деннис_ритцхие.ткт датотеку коју смо претходно користили са насловом изнад ње.

Да бисмо то урадили, куцамо ову наредбу:

авк 'БЕГИН {принт "Деннис Ритцхие"} {принт $ 0}' деннис_ритцхие.ткт

Обратите пажњу на ПОЧЕТИ правило има свој сет радњи затворених унутар свог скупа коврџавих заграда ({}).

Ову исту технику можемо користити са наредбом коју смо претходно користили за цевовод излаза СЗО у авк. Да бисмо то урадили, укуцавамо следеће:

ко | авк 'БЕГИН {принт "Ацтиве Сессионс"} {принт $ 1, $ 4}'

Раздвајачи поља за унос

Ако желиш авк да бисте радили са текстом који не користи размак за одвајање поља, морате му рећи који знак текст користи као сепаратор поља. На пример, / етц / пассвд датотека користи двотачку (:) да одвоје поља.

Користићемо ту датотеку и (сепаратор стринг) опција за препознавање авк користити дебело црево (:) као сепаратор. Укуцавамо следеће да бисмо рекли авк да бисте одштампали име корисничког налога и матичну фасциклу:

авк -Ф: '{принт $ 1, $ 6}' / етц / пассвд

Излаз садржи име корисничког рачуна (или име апликације или демона) и матичну фасциклу (или локацију апликације).

Додавање образаца

Ако су све што нас занимају редовни кориснички налози, можемо да укључимо образац у нашу акцију штампања да бисмо филтрирали све остале уносе. Будући да су бројеви Усер ИД једнаки или већи од 1.000, филтер можемо заснивати на тим информацијама.

Укуцавамо следеће да бисмо извршили акцију штампања само када је треће поље ($3) садржи вредност 1.000 или већу:

авк -Ф: '$ 3> = 1000 {принт $ 1, $ 6}' / етц / пассвд

Узорак треба непосредно претходити радњи са којом је повезан.

Можемо да користимо ПОЧЕТИ правило да се обезбеди наслов за наш мали извештај. Укуцавамо следеће, користећи (\ н) нотација за уметање знака новог реда у насловни низ:

авк -Ф: 'БЕГИН {принт "Усер Аццоунтс \ н -------------"} $ 3> = 1000 {принт $ 1, $ 6}' / етц / пассвд

Узорци су пуноправни регуларни изрази и они су једна од славе авк.

Рецимо да желимо да видимо универзално јединствене идентификаторе (УУИД) монтираних система датотека. Ако претражимо / етц / фстаб датотека за појаве низа „УУИД“, требало би да нам врати те информације.

У нашој команди користимо образац за претрагу „/ УУИД /“:

авк '/ УУИД / {принт $ 0}' / етц / фстаб

Проналази све појаве „УУИД“ и исписује те редове. Заправо бисмо добили исти резултат и без штампати акција јер подразумевана радња исписује цео ред текста. Међутим, ради јасности је корисно бити експлицитан. Када прегледате скрипту или датотеку историје, биће вам драго што сте оставили трагове за себе.

Прва пронађена линија била је линија коментара, и иако се низ „УУИД“ налази у средини, авк ипак пронашао. Можемо подесити регуларни израз и рећи авк да обради само редове који почињу са „УУИД“. Да бисмо то урадили, укуцавамо следеће што укључује почетак токена линије (^):

авк '/ ^ УУИД / {принт $ 0}' / етц / фстаб

Тако је боље! Сада видимо само оригинална упутства за монтирање. Да бисмо још више усавршили излаз, укуцавамо следеће и ограничавамо приказ на прво поље:

авк '/ ^ УУИД / {принт $ 1}' / етц / фстаб

Да је на овој машини монтирано више система датотека, добили бисмо уредну табелу њихових УУИД-ова.

Уграђене функције

авк има много функција које можете позивати и користити у сопственим програмима, како из командне линије, тако и у скриптама. Ако мало копате, биће вам врло плодно.

Да бисмо демонстрирали општу технику позивања функције, погледаћемо неке нумеричке. На пример, следеће штампа квадратни корен од 625:

авк 'БЕГИН {принт скрт (625)}'

Ова наредба исписује арктангенс 0 (нула) и -1 (што је случајно математичка константа, пи):

авк 'ПОЧИНИ {исписати атан2 (0, -1)}'

У следећој команди мењамо резултат атан2 () функција пре него што је одштампамо:

авк 'ПОЧИНИ {исписати атан2 (0, -1) * 100}'

Функције могу да прихвате изразе као параметре. На пример, ево замршеног начина да затражите квадратни корен из 25:

авк 'БЕГИН {принт скрт ((2 + 3) * 5)}'

авк Сцриптс

Ако се ваша командна линија закомплицира или развијете рутину за коју знате да ћете је желети поново користити, можете је пренети авк наредба у скрипту.

У нашем примеру скрипте урадићемо све следеће:

  • Реците љусци који извршни програм да користи за покретање скрипте.
  • Припремити авк да се користи ФС променљива сепаратора поља за читање улазног текста са пољима одвојеним двотачком (:).
  • Користити ОФС излазни сепаратор поља да каже авк користити двотачке (:) за одвајање поља у излазу.
  • Поставите бројач на 0 (нула).
  • Подесите друго поље сваког реда текста на празну вредност (увек је „к“, тако да не треба да га видимо).
  • Одштампајте ред са измењеним другим пољем.
  • Повећајте бројач.
  • Одштампајте вредност бројача.

Наша скрипта је приказана у наставку.

Тхе ПОЧЕТИ правило врши припремне кораке, докКРАЈ правило приказује вредност бројача. Средње правило (које нема име, нити образац, тако да се подудара са сваком линијом) модификује друго поље, исписује линију и повећава бројач.

Први ред скрипте говори љусци коју извршну датотеку да користи (авк, у нашем примеру) за покретање скрипте. Такође пролази поред (име датотеке) опција за авк, који га обавештава да ће текст који ће обрадити доћи из датотеке. Име датотеке проследићемо скрипти када је покренемо.

Скрипту у наставку смо уврстили у текст како бисте могли да исечете и залепите:

#! / уср / бин / авк -ф ПОЧИНИТЕ {# поставите сепараторе поља за улаз и излаз ФС = ":" ОФС = ":" # поништавање рачуна бројача рачуна = 0} {# поставите поље 2 на ништа $ 2 = "" # исписати целу линију исписати $ 0 # пребројати друге рачуне налога ++} ЕНД {# исписати резултате исписати рачуне "рачуне. \ н"}

Сачувајте ово у датотеци која се зове изоставити.авк. Да би скрипту учинили извршном, куцамо следеће користећи цхмод:

цхмод + к изоставити.авк

Сада ћемо га покренути и проћи / етц / пассвд датотека у скрипту. Ово је датотекаавк обрадиће нас, користећи правила из скрипте:

./омит.авк / етц / пассвд

Датотека се обрађује и приказује се сваки ред, као што је приказано у наставку.

Уноси „к“ у другом пољу су уклоњени, али имајте на уму да су раздвајачи поља и даље присутни. Линије се броје и укупан број даје на дну резултата.

авк Не стоји неспретно

авк не стоји за непријатно; стоји за елеганцију. Описана је као филтер за обраду и писац извештаја. Тачније, то је обоје, или, тачније, алат који можете користити за оба ова задатка. У само неколико редова,авк постиже оно што захтева опсежно кодирање на традиционалном језику.

Ту моћ искориштава једноставан концепт правила која садрже обрасце, који одабиру текст за обраду и радње које дефинишу обраду.


$config[zx-auto] not found$config[zx-overlay] not found