Naučite kako koristiti Awk varijable, numeričke izraze i operatore dodjele - 8. dio
Serija naredbi Awk postaje uzbudljiva. Vjerujem da smo u prethodnih sedam dijelova prošli kroz neke osnove Awk-a koje morate savladati da biste mogli izvoditi osnovno filtriranje teksta ili nizova u Linuxu.
Počevši s ovim dijelom, zaronit ćemo u napredna područja Awk-a za rukovanje složenijim operacijama filtriranja teksta ili niza. Stoga ćemo pokriti značajke Awk kao što su varijable, numerički izrazi i operatori dodjele.
Ovi koncepti nisu sveobuhvatno različiti od onih s kojima ste se vjerojatno susreli u mnogim programskim jezicima prije takve ljuske, C, Python i mnogi drugi, tako da nema potrebe puno brinuti o ovoj temi, mi jednostavno revidiramo uobičajene ideje korištenja ove spomenute karakteristike.
Ovo će vjerojatno biti jedan od odjeljaka Awk naredbi koje je najlakše razumjeti, stoga se udobno smjestite i krenimo.
1. Awk varijable
U bilo kojem programskom jeziku, varijabla je držač mjesta koji pohranjuje vrijednost, kada kreirate varijablu u programskoj datoteci, dok se datoteka izvršava, stvara se prostor u memoriji koji će pohraniti vrijednost koju navedete za varijablu.
Varijable Awk možete definirati na isti način na koji definirate varijable ljuske kako slijedi:
variable_name=value
U gornjoj sintaksi:
variable_name
: je naziv koji dajete varijablivrijednost
: vrijednost pohranjena u varijabli
Pogledajmo neke primjere u nastavku:
computer_name=”linux-console.net”
port_no=”22”
email=”[email ”
server=”computer_name”
Pogledajte gornje jednostavne primjere, u prvoj definiciji varijable, vrijednost linux-console.net
dodijeljena je varijabli computer_name
.
Nadalje, vrijednost 22
dodijeljena je varijabli port_no
, također je moguće dodijeliti vrijednost jedne varijable drugoj varijabli kao u prošlom primjeru gdje smo dodijelili vrijednost od computer_name
na poslužitelj varijable.
Ako se sjećate, od drugog dijela ove Awk serije, gdje smo pokrivali uređivanje polja, govorili smo o tome kako Awk dijeli ulazne retke u polja i koristi standardni operator za pristup polju, $
za čitanje različitih polja koja su raščlanjeni. Također možemo koristiti varijable za pohranjivanje vrijednosti polja na sljedeći način.
first_name=$2
second_name=$3
U gornjim primjerima, vrijednost first_name
postavljena je na drugo polje, a second_name
postavljena je na treće polje.
Kao ilustraciju, razmotrite datoteku pod nazivom names.txt
koja sadrži popis korisnika aplikacije s njihovim imenom i prezimenom te spolom. Pomoću naredbe cat možemo vidjeti sadržaj datoteke na sljedeći način:
cat names.txt
Zatim, također možemo koristiti varijable first_name
i second_name
za pohranjivanje imena i prezimena prvog korisnika na popisu tako da pokrenemo Awk naredba ispod:
awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt
Pogledajmo još jedan slučaj, kada izdate naredbu uname -a
na vašem terminalu, ispisuje sve informacije o vašem sustavu.
Drugo polje sadrži vaš naziv glavnog računala
, stoga možemo pohraniti naziv glavnog računala u varijablu pod nazivom naziv glavnog računala
i ispisati ga pomoću Awk > kako slijedi:
uname -a
uname -a | awk '{hostname=$2 ; print hostname ; }'
2. Numerički izrazi
U Awk, numerički izrazi se grade pomoću sljedećih numeričkih operatora:
*
: operator množenja+
: operator zbrajanja/
: operator dijeljenja-
: operator oduzimanja%
: operator modula^
: operator stepenovanja
Sintaksa za numeričke izraze je:
operand1 operator operand2
U gornjem obliku, operand1
i operand2
mogu biti brojevi ili imena varijabli, a operator
je bilo koji od gornjih operatora.
Ispod je nekoliko primjera koji pokazuju kako sastaviti numeričke izraze:
counter=0
num1=5
num2=10
num3=num2-num1
counter=counter+1
Da bismo razumjeli upotrebu numeričkih izraza u Awk, razmotrit ćemo sljedeći primjer u nastavku, s datotekom domains.txt
koja sadrži sve domene u vlasništvu Tecmint.
news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
Za pregled sadržaja datoteke upotrijebite naredbu ispod:
cat domains.txt
Ako želimo izbrojati koliko se puta domena linux-console.net
pojavljuje u datoteci, možemo napisati jednostavnu skriptu da to učinimo na sljedeći način:
#!/bin/bash
for file in $@; do
if [ -f $file ] ; then
#print out filename
echo "File is: $file"
#print a number incrementally for every line containing linux-console.net
awk '/^linux-console.net/ { counter=counter+1 ; printf "%s\n", counter ; }' $file
else
#print error info incase input is not a file
echo "$file is not a file, please specify a file." >&2 && exit 1
fi
done
#terminate script with exit code 0 in case of successful execution
exit 0
Nakon što izradimo skriptu, spremimo je i učinimo je izvršnom, kada je pokrenemo s datotekom, domains.txt
kao izlaznim ulazom, dobivamo sljedeći izlaz:
./script.sh ~/domains.txt
Iz izlaza skripte postoji 6 redaka u datoteci domains.txt
koji sadrže linux-console.net
, kako bi se potvrdilo da ih možete ručno prebrojati.
3. Operatori dodjele
Posljednja značajka Awk koju ćemo obraditi su operatori dodjele, postoji nekoliko operatora dodjele u Awku, a oni uključuju sljedeće:
*=
: operator dodjele množenja+=
: operator dodjele zbrajanja/=
: operator dodjele dijeljenja-=
: operator dodjele oduzimanja%=
: operator dodjele modula^=
: operator dodjele stepenovanja
Najjednostavnija sintaksa operacije dodjele u Awk je sljedeća:
variable_name=variable_name operator operand
Primjeri:
counter=0
counter=counter+1
num=20
num=num-1
Možete koristiti gornje operatore dodjele da skratite operacije dodjele u Awk, razmotrite prethodne primjere, mogli bismo izvršiti dodjelu u sljedećem obliku:
variable_name operator=operand
counter=0
counter+=1
num=20
num-=1
Stoga možemo izmijeniti naredbu Awk u skripti ljuske koju smo upravo gore napisali koristeći +=
operator dodjele na sljedeći način:
#!/bin/bash
for file in $@; do
if [ -f $file ] ; then
#print out filename
echo "File is: $file"
#print a number incrementally for every line containing linux-console.net
awk '/^linux-console.net/ { counter+=1 ; printf "%s\n", counter ; }' $file
else
#print error info incase input is not a file
echo "$file is not a file, please specify a file." >&2 && exit 1
fi
done
#terminate script with exit code 0 in case of successful execution
exit 0
U ovom segmentu Awk serije, pokrili smo neke moćne Awk značajke, to jest varijable, izradu numeričkih izraza i korištenje operatora dodjele, plus nekoliko ilustracija kako ih zapravo možemo koristiti.
Ovi se koncepti ne razlikuju od onih u drugim programskim jezicima, ali mogu postojati neke značajne razlike u programiranju Awk.
U 9. dijelu, pogledat ćemo više Awk značajki koje su posebni uzorci: BEGIN
i END
. Do tada ostanite povezani s Tecmintom.