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:

  1. variable_name: je naziv koji dajete varijabli
  2. vrijednost: 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:

  1. * : operator množenja
  2. + : operator zbrajanja
  3. / : operator dijeljenja
  4. - : operator oduzimanja
  5. % : operator modula
  6. ^ : 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:

  1. *= : operator dodjele množenja
  2. += : operator dodjele zbrajanja
  3. /= : operator dodjele dijeljenja
  4. -= : operator dodjele oduzimanja
  5. %= : operator dodjele modula
  6. ^= : 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.