Siit saate teada, kuidas kasutada Awk muutujaid, numbrilisi avaldisi ja määranguoperaatoreid - 8. osa
Usun, et Awki käsusari muutub põnevaks. Seitsmes eelmises osas käisime läbi mõned Awki põhialused, mida peate valdama, et saaksite Linuxis põhiteksti- või stringifiltrit teostada.
Sellest osast alates sukeldume keerulisemate teksti- või stringifiltreerimisoperatsioonide läbiviimiseks Awki varasematesse piirkondadesse. Seetõttu käsitleme selliseid Awki funktsioone nagu muutujad, numbrilised avaldised ja määranguoperaatorid.
Need mõisted ei erine terviklikult nendest, mida võib-olla olete enne sellist shellit, C, Python pluss paljud teised programmeerimiskeeles kohanud, nii et selle teema pärast pole vaja palju muretseda, muudame lihtsalt levinud ideid need mainitud tunnused.
See on tõenäoliselt üks hõlpsamini mõistetavaid Awki käske, nii et istuge maha ja laske lahti.
1. Awk muutujad
Mis tahes programmeerimiskeeles on muutuja kohahoidja, mis salvestab väärtuse. Kui loote muutuja programmifaili, luuakse faili käivitamisel mällu ruumi, mis salvestab selle muutuja jaoks määratud väärtuse.
Awki muutujaid saate määratleda samamoodi nagu shellimuutujaid järgmiselt:
variable_name=value
Ülaltoodud süntaksis:
-
muutuja_nimi
: on nimi, mille annate muutujale -
value
: muutujasse salvestatud väärtus
Vaatame allpool näiteid:
computer_name=”linux-console.net” port_no=”22” email=”[email ” server=”computer_name”
Heitke pilk ülaltoodud lihtsatele näidetele. Esimeses muutuja määratluses määratakse muutujale computer_name
väärtus linux-console.net
.
Lisaks omistatakse muutujale port_no
väärtus 22
, samuti on võimalik ühe muutuja väärtus omistada teisele muutujale nagu viimases näites, kus määrasime väärtuse väärtusest computer_name
muutuja serverile.
Kui mäletate, siis selle Awki seeria 2. osast, kus me välitöötlust käsitlesime, rääkisime sellest, kuidas Awk jagab sisendribad väljadeks ja kasutab erinevate väljade lugemiseks standardset väljajuurdepääsuoperaatorit $
on parsitud. Samuti võime muutujate abil väljade väärtusi salvestada järgmiselt.
first_name=$2 second_name=$3
Ülalolevates näidetes on first_name
väärtuseks seatud teine väli ja second_name
väärtuseks kolmas väli.
Vaatleme näiteks faili nimega names.txt
, mis sisaldab rakenduse kasutajate loendit, mis näitab nende ees- ja perekonnanime ning sugu. Kasutades käsku cat, saame faili sisu vaadata järgmiselt:
$ cat names.txt
Seejärel saame kasutada ka muutujaid eesnimi
ja second_name
, et salvestada loendis esimese kasutaja ees- ja teine nimi, käivitades alloleva käsu Awk:
$ awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt
Heitkem pilk ka teisele juhtumile, kui väljastate terminalis käsu uname -a
, prindib see kogu teie süsteemiteabe.
Teine väli sisaldab teie hostname
-dokumenti, seetõttu võime hostinime salvestada muutujasse nimega hostname
ja printida see Awki abil järgmiselt:
$ uname -a $ uname -a | awk '{hostname=$2 ; print hostname ; }'
2. Numbrilised väljendid
Rakenduses Awk on arvulised avaldised üles ehitatud järgmiste arvude abil:
-
*
: korrutamise operaator -
+
: liitmisoperaator -
/
: jagamisoperaator -
-
: lahutamise operaator -
%
: moodulioperaator -
^
: eksponentoperaator
Numbriliste avaldiste süntaks on järgmine:
$ operand1 operator operand2
Ülaloleval kujul võivad operand1
ja operand2
olla numbrid või muutujate nimed ning operaator
on ükskõik milline ülaltoodud operaatoritest.
Allpool on toodud mõned näited numbriliste avaldiste koostamise kohta:
counter=0 num1=5 num2=10 num3=num2-num1 counter=counter+1
Arvuliste avaldiste kasutamise mõistmiseks Awkis kaalume järgmist näidet koos failiga domains.txt
, mis sisaldab kõiki Tecmintile kuuluvaid domeene.
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
Faili sisu vaatamiseks kasutage järgmist käsku:
$ cat domains.txt
Kui tahame loendada, mitu korda domeenis linux-console.net
failis ilmub, võime selle jaoks kirjutada lihtsa skripti järgmiselt:
#!/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
Pärast skripti loomist salvestage see ja tehke see käivitatavaks, kui käivitame selle sisendina failiga domains.txt
, saame järgmise väljundi:
$ ./script.sh ~/domains.txt
Skripti väljundis on failis domains.txt
6 rida, mis sisaldavad linux-console.net
, et kinnitada, et saate neid käsitsi loendada.
3. Ülesandeoperaatorid
Viimane Awki funktsioon, mida me käsitleme, on määranguoperaatorid, Awkis on mitu määramise operaatorit ja need sisaldavad järgmist:
-
* =
: korrutamise määramise operaator -
+ =
: lisamise määramise operaator -
/=
: jaotuse määramise operaator -
- =
: lahutamise määramise operaator -
% =
: mooduli määramise operaator -
^=
: eksponentide määramise operaator
Awkis on määramistoimingu lihtsaim süntaks järgmine:
$ variable_name=variable_name operator operand
Näited:
counter=0 counter=counter+1 num=20 num=num-1
Ülaltoodud määranguoperaatoreid saate Awkis määratlustoimingute lühendamiseks kaaluda eelmisi näiteid. Võiksime omistamise teha järgmisel kujul:
variable_name operator=operand
counter=0 counter+=1 num=20 num-=1
Seetõttu saame ülalkirjutatud shelliskriptis käsku Awk muuta, kasutades määranguoperaatorit + =
järgmiselt:
#!/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
Selles Awk-sarja segmendis käsitlesime mõningaid võimsaid Awk-funktsioone, see tähendab muutujaid, numbriliste avaldiste loomist ja määramisoperaatorite kasutamist, lisaks mõned illustratsioonid selle kohta, kuidas neid tegelikult kasutada saame.
Need mõisted ei erine teiste programmeerimiskeelte mõistetest, kuid Awki programmeerimisel võib olla mõningaid olulisi erinevusi.
9. osas vaatleme veel Awki funktsioone, mis on erimustrid: BEGIN
ja END
. Seni püsige Tecmintiga ühenduses.