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:

  1. ime_varijable: je ime koje dajete varijabli
  2. value: 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:

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

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