Linuxi operatsioonisüsteemis on palju utiliite tekstiandmetest või failist aruande otsimiseks ja genereerimiseks. Kasutaja saab hõlpsasti teha mitmesuguseid otsingu-, asendus- ja aruande genereerimise ülesandeid, kasutades käske awk, grep ja sed. awk pole lihtsalt käsk. See on skriptikeel, mida saab kasutada nii terminalist kui ka awk -failist. See toetab muutujat, tingimuslauset, massiivi, silmuseid jne nagu teised skriptikeeled. See saab lugeda rida realt mis tahes faili sisu ja eraldada väljad või veerud konkreetse eraldaja alusel. Samuti toetab see regulaaravaldist teksti sisust või failist teatud stringi otsimiseks ja võtab meetmeid, kui mõni vaste leitakse. Kuidas saate käsku awk ja skripti kasutada, on selles õpetuses näidatud 20 kasuliku näite abil.
Sisu:
- awk printfiga
- awk jagada tühjale kohale
- awk eraldaja vahetamiseks
- awk tabeldusmärgiga eraldatud andmetega
- awk csv andmetega
- awk regulaaravaldis
- awk tõstutundetu regulaaravaldis
- awk muutujaga nf (väljade arv)
- awk gensub () funktsioon
- awk funktsiooniga rand ()
- awk kasutaja määratud funktsioon
- awk kui
- awk muutujad
- awk massiivid
- awk loop
- awk esimese veeru printimiseks
- awk viimase veeru printimiseks
- awk koos grepiga
- awk bash -skriptifailiga
- awk koos sed
Awk kasutamine printf -iga
printf () funktsiooni kasutatakse mis tahes väljundi vormindamiseks enamikus programmeerimiskeeltes. Seda funktsiooni saab kasutada koos awk käsk erinevat tüüpi vormindatud väljundite genereerimiseks. käsku awk kasutatakse peamiselt mis tahes tekstifaili jaoks. Looge tekstifail nimega töötaja.txt allpool toodud sisuga, kus väljad on vahekaardiga eraldatud („ t”).
töötaja.txt
1001 John sena 40000
1002 Jafar Iqbal 60000
1003 Meher Nigar 30000
1004 Jonny maks 70000
Järgmine käsk awk loeb andmeid töötaja.txt fail rida realt ja printige pärast vormindamist esimene fail. Siin, %10 s n tähendab, et väljund on 10 tähemärki pikk. Kui väljundi väärtus on alla 10 tähemärgi, lisatakse tühikud väärtuse ette.
$ awk'{printf'%10s n', 1 dollar'töötaja.txt
Väljund:
awk jagada tühjale kohale
Sõnade või väljade eraldaja vaikimisi mis tahes teksti jagamiseks on tühik. käsk awk võib teksti väärtust sisestada mitmel viisil. Sisendtekst edastatakse viskas välja käsku järgmises näites. Tekst, ' Mulle meeldib programmeerimine Jagatakse vaikimisi eraldajaks, ruumi ja kolmas sõna prinditakse väljundina.
$viskas välja 'Mulle meeldib programmeerimine' | awk „{print $ 3}”Väljund:
awk eraldaja vahetamiseks
awk käsku saab kasutada mis tahes failisisu eraldaja muutmiseks. Oletame, et teil on tekstifail nimega telefon.txt järgmise sisuga, kus faili sisu väljade eraldajana kasutatakse „:”.
telefon.txt
+123: 334: 889: 778+880: 1855: 456: 907
+9: 7777: 38644: 808
Eraldaja muutmiseks käivitage järgmine käsk awk, ':' kõrval '-' faili sisule, telefon.txt .
$ cat phone.txt$ awk '$ 1 = $ 1' FS = ':' OFS = '-' phone.txt
Väljund:
awk tabeldusmärgiga eraldatud andmetega
käsul awk on palju sisseehitatud muutujaid, mida kasutatakse teksti lugemiseks erineval viisil. Kaks neist on FS ja OFS . FS on sisendvälja eraldaja ja OFS on väljundvälja eraldaja muutujad. Nende muutujate kasutusviise on näidatud selles jaotises. Loo vahekaart eraldatud fail nimega input.txt järgmise kasutusalaga testimiseks FS ja OFS muutujad.
Input.txt
Kliendipoolne skriptikeelServeripoolne skriptikeel
Andmebaasiserver
Veebiserver
Muutuja FS abil vahekaardiga
Järgmine käsk jagab iga rea input.txt vahekaardil põhinev fail („ t”) ja printige iga rea esimene väli.
$awk „{print $ 1}” FS=' t'input.txtVäljund:
Muutuja OFS kasutamine vahekaardiga
Järgmine käsk awk prindib 9th ja 5th väljad 'Ls -l' käsu väljund tabulaatoriga pärast veeru pealkirja printimist Nimi ja Suurus . Siin, OFS muutujat kasutatakse väljundi vormindamiseks vahelehe abil.
$ls -neid$ls -neid | awk -v OFS=' t' 'BEGIN {printf'%s t%s n ',' Name ',' Size '} {print $ 9, $ 5}'
Väljund:
awk CSV andmetega
Mis tahes CSV -faili sisu saab käsuga awk mitmel viisil sõeluda. Looge CSV -fail nimega „ klient.csv Järgmise käsuga awk käsu rakendamiseks.
klient.txt
Id, nimi, e -post, telefon1, Sophia, [email protected], (862) 478-7263
2, Amelia, [kaitstud e-postiga], (530) 764-8000
3, Emma, [kaitstud e-postiga], (542) 986-2390
CSV -faili ühe välja lugemine
'-F' suvandit kasutatakse käsuga awk, et määrata iga faili rea eraldamiseks eraldaja. Järgmine käsk awk prindib nimi väli klient.csv faili.
$kassklient.csv$awk -F ',' „{print $ 2}”klient.csv
Väljund:
Mitme välja lugemine, kombineerides seda muu tekstiga
Järgmine käsk prindib kolm välja klient.csv pealkirja teksti kombineerides, Nimi, e -post ja telefon . Esimene rida klient.csv fail sisaldab iga välja pealkirja. EI muutuja sisaldab faili reanumbrit, kui käsk awk parsib faili. Selles näites NR muutujat kasutatakse faili esimese rea väljajätmiseks. Väljund näitab 2nd, 3rdja 4thkõigi ridade väljad, välja arvatud esimene rida.
$awk -F ',' 'NR> 1 {print' Name: '$ 2', Email: '$ 3', Phone: '$ 4}'klient.csvVäljund:
CSV -faili lugemine awk -skripti abil
awk -skripti saab käivitada, käivitades faili awk. Selles näites on näidatud, kuidas luua awk -faili ja seda käivitada. Looge fail nimega awkcsv.awk järgmise koodiga. ALUSTA märksõna kasutatakse skriptis, et teavitada käsku awk skripti täitmiseks ALUSTA osa enne muude ülesannete täitmist. Siin on väljade eraldaja ( FS ) kasutatakse jagava eraldusmärgi määratlemiseks ja 2ndja 1stväljad prinditakse vastavalt printf () funktsioonis kasutatud vormingule.
awkcsv.awkALUSTA{FS= ','} { printf '% 5s (% s) n',$2,$1}
Jookse awkcsv.awk faili sisuga klient.csv faili järgmise käsuga.
$awk -fawkcsv.awk klient.csvVäljund:
awk regulaaravaldis
Regulaaravaldis on muster, mida kasutatakse teksti mis tahes stringi otsimiseks. Regulaaravaldist kasutades saab hõlpsasti teha erinevat tüüpi keerulisi otsingu- ja asendusülesandeid. Selles jaotises on toodud mõned tavalise avaldise lihtsad kasutusviisid käsuga awk.
Sobiv tegelaneseatudJärgmine käsk sobib sõnaga Loll või narr või Lahe sisestusstringi abil ja printige, kui sõna leiab. Siin, Nukk ei ühti ja ei prindi.
$printf 'Loll nLahe nNukk nbool ' | awk '/[FbC] ool/'Väljund:
Stringi otsimine rea alguses
'^' sümbolit kasutatakse regulaaravaldises, et otsida mis tahes mustrit rea alguses. ' Linux ' sõna otsitakse järgmises näites iga teksti rea alguses. Siin algab kaks rida tekstiga, 'Linux 'Ja need kaks rida kuvatakse väljundis.
$viskas välja -Ja 'Linux on tasuta kasutamiseks nSee on avatud lähtekoodiga tarkvara nLinuxHint onpopulaarne ajaveebisait ' | awk '/^Linux/'
Väljund:
Otsitakse stringi rea lõpus
'$' sümbolit kasutatakse regulaaravaldises, et otsida mis tahes mustrit teksti iga rea lõpus. ' Stsenaarium 'Sõna otsitakse järgmises näites. Siin on kaks rida sõna, Stsenaarium rea lõpus.
$viskas välja -Ja 'PHP skript nJavaScript nVisuaalne programmeerimine ' | awk '/Skript $/'Väljund:
Otsimine, jättes konkreetse märgistiku välja
'^' sümbol tähistab teksti algust, kui seda kasutatakse mis tahes stringimustri ees (‘ / ^… /’) või enne mis tahes märgistikku, mille on deklareerinud ^ […] . Kui '^' sümbolit kasutatakse kolmanda sulu sees, [^…], siis jäetakse sulgudes olev märgikomplekt otsingu tegemisel välja. Järgmine käsk otsib sõna, mis ei alga tähega 'F' aga lõpetades ' ool '. Lahe ja bool trükitakse vastavalt mustrile ja tekstiandmetele.
$ printf 'Loll nLahe nNukk nbool ' |awk' / [^ F] ool /'Väljund:
awk tõstutundetu regulaaravaldis
Vaikimisi otsib regulaaravaldis tõstutundlikke otsinguid, kui otsitakse stringi mis tahes mustrit. Väiketähtede suhtes tundlikku otsingut saab teha käsuga awk regulaaravaldisega. Järgmises näites alla laskma () funktsiooni kasutatakse väiketähtedeta otsingu tegemiseks. Siin teisendatakse sisendteksti iga rea esimene sõna, kasutades selleks väiketähti alla laskma () funktsiooni ja sobituvad regulaaravaldise mustriga. üles () funktsiooni saab kasutada ka sel eesmärgil, sel juhul tuleb muster määratleda suure algustähega. Järgmises näites määratletud tekst sisaldab otsingusõna, 'Võrk ”Kahel real, mis trükitakse väljundina.
$viskas välja -Ja 'Veebidisain nVeebiarendus nRaamistik ' | awk 'tolower ($ 0) ~ /^web /;'Väljund:
awk koos muutujaga NF (väljade arv)
NF on sisseehitatud muutuja käsust awk, mida kasutatakse väljade koguarvu lugemiseks sisendteksti igal real. Looge mis tahes tekstifail, millel on mitu rida ja mitu sõna. fail input.txt Siin kasutatakse faili, mis on loodud eelmises näites.
Kasutades käsurealt NF -i
Siin kasutatakse esimese käsu sisu kuvamiseks input.txt faili ja teist käsku kasutatakse, et näidata väljade koguarvu faili igal real, kasutades NF muutuja.
$ cat input.txt$ awk '{print NF}' input.txt
Väljund:
NF kasutamine awk -failis
Looge awk -fail nimega loe.wak allpool toodud skriptiga. Kui see skript käivitatakse mis tahes tekstiandmetega, prinditakse väljundina iga rea sisu koos kõigi väljadega.
loe.wak
{trükkida $0}{printida'[Välju kokku:'NF']'}
Käivitage skript järgmise käsuga.
$awk -fcount.awk input.txtVäljund:
awk gensub () funktsioon
getsub () on asendusfunktsioon, mida kasutatakse stringide otsimiseks konkreetse eraldaja või regulaaravaldise mustri alusel. See funktsioon on määratletud 'Nägu' pakett, mis pole vaikimisi installitud. Selle funktsiooni süntaks on toodud allpool. Esimene parameeter sisaldab regulaaravaldise mustrit või otsingu eraldajat, teine parameeter sisaldab asendusteksti, kolmas parameeter näitab, kuidas otsingut tehakse, ja viimane parameeter sisaldab teksti, milles seda funktsiooni rakendatakse.
Süntaks:
gensub(regexp, asendamine, kuidas[, sihtmärk])Installimiseks käivitage järgmine käsk näkk pakett kasutamiseks getsub () funktsioon awk käsuga.
$ sudo apt-get install gawkLooge tekstifail nimega ' salesinfo.txt ”Selle näite harjutamiseks järgmise sisuga. Siin on väljad vahekaardiga eraldatud.
salesinfo.txt
Minu 700 000Teie 800 000
K 750000
Koguge 200 000
P 430000
L 820000
Rakenduse numbriväljade lugemiseks käivitage järgmine käsk salesinfo.txt faili ja printige kogu müügisumma. Siin näitab kolmas parameeter „G” globaalset otsingut. See tähendab, et mustrit otsitakse faili täielikust sisust.
$awk '{x = gensub (' t ',' ',' G ', 2 dollarit); printf x '+'} LÕPP {print 0} 'salesinfo.txt| bc -neidVäljund:
awk funktsiooniga rand ()
rida () funktsiooni kasutatakse mis tahes juhusliku arvu genereerimiseks, mis on suurem kui 0 ja väiksem kui 1. Seega genereerib see alati murdarvu, mis on väiksem kui 1. Järgmine käsk genereerib murdosa juhusliku arvu ja korrutab väärtuse 10 -ga, et saada arv rohkem kui 1. Funktsiooni printf () rakendamiseks prinditakse murdosa, mis koosneb kahest numbrist pärast koma. Kui käivitate järgmise käsu mitu korda, saate iga kord erineva väljundi.
$awk 'BEGIN {printf' Number on =%. 2f n ', rand ()*10}'Väljund:
awk kasutaja määratud funktsioon
Kõik eelnevates näidetes kasutatud funktsioonid on sisseehitatud funktsioonid. Kuid mis tahes konkreetse ülesande täitmiseks võite oma awk-skriptis deklareerida kasutaja määratud funktsiooni. Oletame, et soovite luua kohandatud funktsiooni ristküliku pindala arvutamiseks. Selle ülesande täitmiseks looge fail nimega ' ala.wak 'Järgmise skriptiga. Selles näites on kasutaja määratud funktsioon nimega ala () deklareeritakse skriptis, mis arvutab pindala sisendparameetrite põhjal ja tagastab pindala väärtuse. getline käsku kasutatakse siin kasutajalt sisendi võtmiseks.
ala.wak
# Arvutage pindalafunktsioonipiirkonnas(kõrgus,laius){
tagasikõrgus*laius
}
# Alustab täitmist
ALUSTA{
printida'Sisestage kõrguse väärtus:'
getline h< '-'
printida'Sisestage laiuse väärtus:'
getline w< '-'
printida'Piirkond ='piirkonnas(h,sisse)
}
Käivitage skript.
$awk -fala.wakVäljund:
awk kui näide
awk toetab tingimuslauseid nagu teisedki standardsed programmeerimiskeeled. Selles jaotises näidatakse kolme tüüpi if -lauseid, kasutades kolme näidet. Looge tekstifail nimega items.txt järgmise sisuga.
items.txt
Kõvaketas Samsung 100 dollaritHiir A4Tech
Printer HP 200 dollarit
Lihtne kui näide :
järgnev käsk loeb selle sisu items.txt fail ja kontrollige 3rd välja väärtus igal real. Kui väärtus on tühi, prindib see veateate koos reanumbriga.
$awk '{if ($ 3 ==' ') print' Hinnaväli puudub real 'NR}'items.txtVäljund:
kui-muu näide:
Järgmine käsk prindib kauba hinna, kui 3rdväli on reas olemas, vastasel juhul prindib see veateate.
$ awk'{if ($ 3 ==' ') print' Hinnaväli puudub 'muul juhul prindi üksuse hind on $ 3}esemeid.txt
Väljund:
kui-muidu-kui näide:
Kui terminalist käivitatakse järgmine käsk, võtab see kasutajalt sisendi. Sisendväärtust võrreldakse iga tingimusega, kui tingimus on tõene. Kui mõni tingimus saab tõeks, trükitakse see vastav hinne. Kui sisendväärtus ei vasta ühelegi tingimusele, prinditakse see ebaõnnestunult.
$awk 'BEGIN {print' Sisestage märk: 'getline märk<'-'
kui (märk> = 90) printige „A+”
muidu, kui (märk> = 80) prindi 'A'
muidu, kui (märk> = 70) printige 'B+'
muidu printige 'Ebaõnnestunud'} '
Väljund:
awk muutujad
Muutuja awk deklareerimine sarnaneb shelli muutuja deklaratsiooniga. Muutuja väärtuse lugemisel on erinevus. Väärtuse lugemiseks kasutatakse sümbolit „$” koos kestamuutuja muutuja nimega. Kuid väärtuse lugemiseks pole vaja kasutada muutujaga „$” koos muutujaga awk.
Lihtsa muutuja kasutamine:
Järgmine käsk kuulutab muutuja nimega 'Sait' ja sellele muutujale määratakse stringi väärtus. Muutuja väärtus trükitakse järgmisesse avaldusse.
$awk 'BEGIN {site =' LinuxHint.com '; prindi sait} 'Väljund:
Muutuja kasutamine failist andmete toomiseks
Järgmine käsk otsib sõna 'Printer' failis items.txt . Kui mõni faili rida algab tähega 'Printer 'Siis salvestab see väärtuse 1st , 2nd ja 3rd väljad kolmeks muutujaks. nimi ja hind muutujad trükitakse.
$ awk'/ Printer/ {name = $ 1; brand = 2 $; price = 3 $; print' item name = 'name;print 'kauba hind =' hind} 'esemeid.txt
Väljund:
awk massiivid
Nii numbrilisi kui ka nendega seotud massiive saab awk -is kasutada. Massiivi muutujadeklaratsioon awk -s on teiste programmeerimiskeeltega sama. Selles jaotises on näidatud mõningaid massiivide kasutusviise.
Assotsiatiivne massiiv:
Massiivi indeks on mis tahes string assotsiatiivse massiivi jaoks. Selles näites deklareeritakse ja trükitakse kolmest elemendist koosnev assotsiatiivne massiiv.
$awk 'BEGIN {books ['Web Design'] = 'HTML5 õppimine';
books ['Web Programming'] = 'PHP ja MySQL'
books ['PHP Framework'] = 'Õppides Laravel 5'
printf '%s n%s n%s n', raamatud ['Web Design'], raamatud ['Web Programming'],
raamatud ['PHP Framework']} '
Väljund:
Numbriline massiiv:
Kolmest elemendist koosnev numbriline massiiv deklareeritakse ja prinditakse eraldusmärgiga.
$ awk'BEGIN {number [0] = 80;
number [1] = 55;
number [2] = 76;
# printmassiivi elementi
printf 'Massiivi väärtused: %d t%d t%d n', number [0], number [1], number [2]; } '
Väljund:
awk loop
Awk toetab kolme tüüpi silmuseid. Nende silmuste kasutusviise on siin näidatud kolme näite abil.
Silmus:
samas kui järgmises käsus kasutatav silmus kordab 5 korda ja väljub tsüklist break -avalduse jaoks.
$ awk „ALGUS {n = 1; samas (n 5) murda; print n; n ++}} 'Väljund:
Silmus:
Järgmises käsus awk kasutatav silmus arvutab summa vahemikus 1 kuni 10 ja prindib selle väärtuse.
$awk 'ALGUS {summa = 0; jaoks (n = 1; n<= 10; n++) sum=sum+n; print sum }'Väljund:
Tegevusahel:
järgmise käsu tegemise tsükkel prindib kõik paarisarvud vahemikus 10 kuni 5.
$awk 'ALGUS {loendur = 10; do {if (loendur%2 == 0) printi loendur; loendur-}samas (loendur> 5)} '
Väljund:
awk esimese veeru printimiseks
Iga faili esimese veeru saab printida, kasutades muutujat $ 1 awk -s. Aga kui esimese veeru väärtus sisaldab mitut sõna, trükitakse ainult esimese veeru esimene sõna. Spetsiifilise eraldaja abil saab esimese veeru korralikult printida. Looge tekstifail nimega õpilased.txt järgmise sisuga. Siin sisaldab esimene veerg kahe sõna teksti.
Õpilased.txt
Kaniz Fatema 30thpartiiAbir Hossain 35thpartii
Johannes Aabraham 40thpartii
Käivitage käsk awk ilma eraldajata. Trükitakse esimese veeru esimene osa.
$awk „{print $ 1}”õpilased.txtKäivitage awk käsk järgmise eraldajaga. Esimese veeru täielik osa trükitakse.
$awk -F '\ s \ s' „{print $ 1}”õpilased.txtVäljund:
awk viimase veeru printimiseks
$ (NF) muutujat saab kasutada mis tahes faili viimase veeru printimiseks. Järgmised awk -käsud prindivad välja viimase osa ja viimase veeru täieliku osa õpilased.txt faili.
$awk '{print $ (NF)}'õpilased.txt$awk -F '\ s \ s' '{print $ (NF)}'õpilased.txt
Väljund:
awk koos grepiga
grep on Linuxi teine kasulik käsk otsida failist sisu mis tahes regulaaravaldise alusel. Järgmises näites on näidatud, kuidas saab käske awk ja grep koos kasutada. haaret käsku kasutatakse töötaja ID teabe otsimiseks, ' 1002 ’Pärit töötaja.txt faili. Käsu grep väljund saadetakse sisendandmetena aadressile awk. 5% boonust loetakse ja trükitakse töötaja ID palga alusel, ' 1002 ' awk käsul.
$kasstöötaja.txt$haaret „1002”töötaja.txt| awk -F ' t' '{print $ 2' saab $ '($ 3*5)/100' boonust '}'
Väljund:
awk koos BASH -failiga
Nagu muud Linuxi käsud, saab käsku awk kasutada ka BASH -skriptis. Looge tekstifail nimega customers.txt järgmise sisuga. Selle faili iga rida sisaldab teavet nelja välja kohta. Need on kliendi ID, nimi, aadress ja mobiilinumber, mis on üksteisest eraldatud ‘/ '.
customers.txt
AL4934 / Charles M Brunner / 4838 Beeghley Street, Huntsville, Alabama / 256-671-7942CA5455 / Virginia S Mota / 930 Bassel Street, VALLECITO, California / 415-679-5908
IL4855 / Ann A Neale / 1932 Patterson Fork Road, Chicago, Illinois / 773-550-5107
Looge bash -fail nimega item_search.bash järgmise skriptiga. Selle skripti kohaselt võetakse olekuväärtus kasutajalt ja otsitakse sealt sisse kliendid.txt faili autor haaret käsk ja edastati sisendina käsule awk. Käsk Awk loeb 2nd ja 4th iga rea väljad. Kui sisendväärtus sobib oleku väärtusega customers.txt faili, siis prindib see kliendi oma nimi ja mobiili number , vastasel juhul prindib see sõnumi Klienti ei leitud .
item_search.bash
#!/bin/bashviskas välja 'Sisestage osariigi nimi:'
loeosariik
klientidele=''haaret '$ osariik'customers.txt| awk -F '/' '{print' Kliendi nimi: '$ 2,',
Mobiilinumber: $ 4}''
kui [ '$ kliente' !='' ];siis
viskas välja $ kliente
muidu
viskas välja 'Kliente ei leitud'
olla
Väljundite kuvamiseks käivitage järgmised käsud.
$kasscustomers.txt$löömaitem_search.bash
Väljund:
awk koos sed
Teine kasulik Linuxi otsimisvahend on sed . Seda käsku saab kasutada nii failide otsimiseks kui ka teksti asendamiseks. Järgmine näide näitab käsu awk kasutamist koos sed käsk. Siin otsib käsk sed kõiki töötajate nimesid, mis algavad tähega „ J 'Ja läheb sisendina käsule awk. awk trükib töötaja nimi ja ID pärast vormindamist.
$kasstöötaja.txt$sed -n '/J/p'töötaja.txt| awk -F ' t' '{printf'%s (%s) n ', $ 2, $ 1}'
Väljund:
Järeldus:
Käsu awk abil saate pärast andmete õiget filtreerimist eri tüüpi aruandeid luua mis tahes tabeli- või piiritletud andmete põhjal. Loodetavasti saate pärast selles õpetuses näidete harjutamist õppida, kuidas käsk awk töötab.