Naučite se uporabljati spremenljivke Awk, numerične izraze in operaterje dodelitve - 8. del
Verjamem, da serija ukazov Awk postaja vznemirljiva, v prejšnjih sedmih delih smo se sprehodili po nekaterih osnovah programa Awk, ki jih morate obvladati, da boste lahko v Linuxu izvedli nekaj osnovnih filtriranja besedil ali nizov.
Začenši s tem delom, se bomo potopili v predhodna območja Awka, da bomo lahko obdelali bolj zapletene operacije filtriranja besedil ali nizov. Zato bomo zajeli funkcije Awk, kot so spremenljivke, številski izrazi in operaterji dodelitve.
Ti koncepti se ne razlikujejo v celoti od tistih, s katerimi ste se verjetno srečevali v mnogih programskih jezikih pred takšno lupino, C, Python in številnimi drugimi, zato se glede te teme ni treba veliko skrbeti, preprosto popravljamo običajne ideje te omenjene značilnosti.
To bo verjetno eden najlažjih razdelkov za ukaze v programu Awk, zato sedite in pustite, da gremo naprej.
1. Spremenljivke Awk
V katerem koli programskem jeziku je spremenljivka imetnik mesta, ki shrani vrednost. Ko ustvarite spremenljivko v programski datoteki, se med izvajanjem datoteke v pomnilniku ustvari nekaj prostora, ki bo shranil vrednost, ki ste jo določili za spremenljivko.
Spremenljivke Awk lahko definirate na enak način kot spremenljivke lupine, kot sledi:
variable_name=value
V zgornji sintaksi:
-
ime_spremenljivke
: je ime, ki mu daste spremenljivko -
value
: vrednost, shranjena v spremenljivki
Oglejmo si nekaj primerov spodaj:
computer_name=”linux-console.net” port_no=”22” email=”[email ” server=”computer_name”
Oglejte si zgornje preproste primere: v prvi definiciji spremenljivke je spremenljivki ime_računalnika
dodeljena vrednost linux-console.net
.
Poleg tega je vrednost 22
dodeljena spremenljivki port_no
, vrednost ene spremenljivke pa je mogoče dodeliti tudi drugi spremenljivki, kot v zadnjem primeru, kjer smo dodelili vrednost ime_računalnika
na spremenljivi strežnik.
Če se lahko spomnite, smo že od 2. dela te serije Awk pokrivali urejanje polj, govorili smo o tem, kako Awk deli vhodne vrstice na polja in uporablja standardni operater dostopa do polja, $
, da prebere različna polja, ki so bili razčlenjeni. Spremenljivke lahko uporabimo tudi za shranjevanje vrednosti polj, kot sledi.
first_name=$2 second_name=$3
V zgornjih primerih je vrednost first_name
nastavljena na drugo polje, second_name
pa na tretje polje.
Za ponazoritev si oglejte datoteko z imenom names.txt
, ki vsebuje seznam uporabnikov aplikacije, ki navaja njihova imena in priimke ter spol. Z uporabo ukaza cat si lahko vsebino datoteke ogledamo na naslednji način:
$ cat names.txt
Nato lahko spremenljivki first_name
in second_name
uporabimo tudi za shranjevanje prvega in drugega imena prvega uporabnika na seznam, tako da zaženemo spodnji ukaz Awk:
$ awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt
Oglejmo si še en primer, ko na terminalu izdate ukaz uname -a
, ta izpiše vse podatke o vašem sistemu.
Drugo polje vsebuje vaše ime gostitelja
, zato lahko ime gostitelja shranimo v spremenljivko z imenom ime gostitelja
in ga z uporabo Awk natisnemo na naslednji način:
$ uname -a $ uname -a | awk '{hostname=$2 ; print hostname ; }'
2. Številski izrazi
V Awk so numerični izrazi zgrajeni z uporabo naslednjih številskih operatorjev:
-
*
: operator množenja -
+
: operator dodajanja -
/
: operater delitve -
-
: operator odštevanja -
%
: operator modula -
^
: operator stopnjevanja
Sintaksa številskih izrazov je:
$ operand1 operator operand2
V zgornji obliki sta lahko operand1
in operand2
številki ali imeni spremenljivk, operator
pa kateri koli od zgornjih operaterjev.
Spodaj je nekaj primerov, ki prikazujejo, kako zgraditi številske izraze:
counter=0 num1=5 num2=10 num3=num2-num1 counter=counter+1
Da bi razumeli uporabo številskih izrazov v programu Awk, bomo upoštevali spodnji primer z datoteko domains.txt
, ki vsebuje vse domene v lasti Tecminta.
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
Če si želite ogledati vsebino datoteke, uporabite spodnji ukaz:
$ cat domains.txt
Če želimo prešteti, kolikokrat se v datoteki prikaže domena linux-console.net
, lahko za to napišemo preprost skript:
#!/bin/bash for file in [email ; 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
Ko ustvarite skript, ga shranite in naredite izvedljiv, ko ga zaženemo z datoteko domains.txt
kot izhodnim vhodom, dobimo naslednji izhod:
$ ./script.sh ~/domains.txt
V izhodnem besedilu skripta je v datoteki domains.txt
6 vrstic, ki vsebujejo linux-console.net
, kar potrjuje, da jih lahko ročno preštejete.
3. Operaterji dodelitve
Zadnja funkcija Awk, ki jo bomo obravnavali, je operaterji dodelitve, v Awk je več operaterjev dodelitve, ki vključujejo naslednje:
-
* =
: operator dodelitve množenja -
+ =
: operator dodeljevanja seštevanja -
/=
: operater dodelitve delitve -
- =
: operater dodelitve odštevanja -
% =
: operater dodelitve modula -
^=
: operater dodelitve stopnjevanja
Najenostavnejša sintaksa operacije dodelitve v programu Awk je naslednja:
$ variable_name=variable_name operator operand
Primeri:
counter=0 counter=counter+1 num=20 num=num-1
Zgornje operaterje dodelitve lahko uporabite za skrajšanje operacij dodelitve v programu Awk, upoštevajte prejšnje primere, dodelitev bi lahko izvedli v naslednji obliki:
variable_name operator=operand
counter=0 counter+=1 num=20 num-=1
Zato lahko ukaz Awk v skriptu lupine, ki smo ga pravkar napisali, spremenimo z uporabo operaterja dodelitve + =
, kot sledi:
#!/bin/bash for file in [email ; 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
V tem segmentu serije Awk smo zajeli nekaj zmogljivih funkcij Awk, to so spremenljivke, gradnjo številskih izrazov in uporabo operatorjev dodelitve ter nekaj ilustracij, kako jih lahko dejansko uporabimo.
Ti koncepti se sicer ne razlikujejo od tistih v drugih programskih jezikih, vendar lahko pri programiranju Awk obstajajo nekatere pomembne razlike.
V 9. delu si bomo ogledali več funkcij Awk, ki so posebni vzorci: BEGIN
in END
. Do takrat ostanite povezani s Tecmintom.