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:

  1. muutuja_nimi : on nimi, mille annate muutujale
  2. 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:

  1. * : korrutamise operaator
  2. + : liitmisoperaator
  3. /: jagamisoperaator
  4. - : lahutamise operaator
  5. % : moodulioperaator
  6. ^: 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:

  1. * = : korrutamise määramise operaator
  2. + = : lisamise määramise operaator
  3. /= : jaotuse määramise operaator
  4. - = : lahutamise määramise operaator
  5. % = : mooduli määramise operaator
  6. ^= : 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.