Naučite kako koristiti Awk varijable, numeričke izraze i operatore dodjele - 8. dio
Serija Awk komandi postaje uzbudljiva. Vjerujem da smo u prethodnih sedam dijelova prošli kroz neke osnove Awk-a koje trebate savladati da biste omogućili obavljanje osnovnog filtriranja teksta ili stringova u Linuxu.
Počevši od ovog dijela, uronit ćemo u napredna područja Awk kako bismo rukovali složenijim operacijama filtriranja teksta ili stringova. Stoga ćemo pokriti Awk karakteristike kao što su varijable, numerički izrazi i operatori dodjeljivanja.
Ovi koncepti se ne razlikuju sveobuhvatno od onih s kojima ste se vjerovatno susreli u mnogim programskim jezicima prije takve ljuske, C, Python i mnogih drugih, tako da nema potrebe da brinete mnogo o ovoj temi, mi jednostavno revidiramo uobičajene ideje korištenja ove pomenute karakteristike.
Ovo će vjerovatno biti jedan od najlakših Awk odjeljaka komandi za razumijevanje, stoga se opustite i krenimo.
1. Awk varijable
U bilo kom 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.
Možete definirati Awk varijable na isti način na koji definirate varijable ljuske kako slijedi:
variable_name=value
U gornjoj sintaksi:
ime_varijable
: je ime koje dajete varijablivalue
: vrijednost pohranjena u varijabli
Pogledajmo neke primjere u nastavku:
computer_name=”linux-console.net”
port_no=”22”
email=”[email ”
server=”computer_name”
Pogledajte jednostavne primjere iznad, u prvoj definiciji varijable, vrijednost linux-console.net
je dodijeljena varijabli computer_name
.
Nadalje, vrijednost 22
je dodijeljena varijabli port_no
, također je moguće dodijeliti vrijednost jedne varijable drugoj varijabli kao u zadnjem primjeru gdje smo dodijelili vrijednost od computer_name
na server varijabli.
Ako se možete sjetiti, odmah iz drugog dijela ove Awk serije, gdje smo obrađivali uređivanje polja, razgovarali smo o tome kako Awk dijeli ulazne linije na polja i koristi standardni operator pristupa 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
je postavljena na drugo polje, a second_name
je postavljena na treće polje.
Kao ilustraciju, razmotrite datoteku pod nazivom names.txt
koja sadrži listu korisnika aplikacije navodeći njihova imena i prezimena plus spol. Koristeći naredbu 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
da pohranimo prvo i drugo ime prvog korisnika na listi tako što ćemo pokrenuti Awk naredba ispod:
awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt
Hajde da pogledamo i drugi slučaj, kada izdate naredbu uname -a
na svom terminalu, ona ispisuje sve informacije o vašem sistemu.
Drugo polje sadrži vaše hostname
, stoga možemo pohraniti hostname u varijablu pod nazivom hostname
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 sabiranja/
: operator dijeljenja-
: operator oduzimanja%
: operator modula^
: operator eksponencijacije
Sintaksa za numeričke izraze je:
operand1 operator operand2
U gornjem obrascu, operand1
i operand2
mogu biti brojevi ili imena varijabli, a operator
je bilo koji od operatora iznad.
U nastavku su neki primjeri koji pokazuju kako se grade numerički izrazi:
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, sa datotekom domains.txt
koja sadrži sve domene u vlasništvu Tecminta jako>.
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 koristite naredbu ispod:
cat domains.txt
Ako želimo da izbrojimo koliko se puta domena linux-console.net
pojavljuje u datoteci, možemo napisati jednostavnu skriptu koja će to učiniti 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 kreiranja skripte, spremite je i učinite izvršnom, kada je pokrenemo sa datotekom, domains.txt
kao izlaznim ulazom, dobijamo sljedeći izlaz:
./script.sh ~/domains.txt
Iz izlaza skripte, postoji 6 linija u datoteci domains.txt
koje sadrže linux-console.net
, da potvrdite da ih možete ručno prebrojati.
3. Operatori dodjele
Posljednja Awk karakteristika koju ćemo pokriti su operatori dodjeljivanja, postoji nekoliko operatora dodjele u Awk-u, a oni uključuju sljedeće:
*=
: operator dodjeljivanja množenja+=
: operator dodjeljivanja sabiranja/=
: operator dodjeljivanja podjela-=
: operator dodjeljivanja oduzimanja%=
: operator dodjeljivanja modula^=
: operator dodjeljivanja eksponencijacije
Najjednostavnija sintaksa operacije dodjeljivanja 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 gore navedene operatore dodjeljivanja da skratite operacije dodjeljivanja u Awk, uzmite u obzir 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 promijeniti naredbu Awk u shell skripti koju smo upravo napisali koristeći +=
operator dodjeljivanja 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 karakteristike, to su varijable, građenje numeričkih izraza i korištenje operatora dodjeljivanja, plus nekoliko ilustracija kako ih zapravo možemo koristiti.
Ovi koncepti se ne razlikuju od onih u drugim programskim jezicima, ali mogu postojati neke značajne razlike u Awk programiranju.
U 9. dijelu, pogledat ćemo više Awk karakteristika koje predstavljaju posebne obrasce: BEGIN
i END
. Do tada, ostanite povezani na Tecmint.