Lær hvordan du bruker Awk-variabler, numeriske uttrykk og tildelingsoperatører - del 8


Awk-kommandoserien begynner å bli spennende. Jeg tror, i de forrige syv delene gikk vi gjennom noen grunnleggende for Awk som du må mestre for å gjøre det mulig å utføre grunnleggende tekst- eller strengfiltrering i Linux.

Fra og med denne delen skal vi dykke inn i avanserte områder av Awk for å håndtere mer komplekse tekst- eller strengfiltreringsoperasjoner. Derfor skal vi dekke Awk-funksjoner som variabler, numeriske uttrykk og tilordningsoperatorer.

Disse konseptene er ikke helt forskjellige fra de du sannsynligvis har møtt i mange programmeringsspråk før slike shell, C, Python pluss mange andre, så det er ingen grunn til å bekymre deg mye om dette emnet, vi reviderer ganske enkelt de vanlige ideene om å bruke disse nevnte funksjonene.

Dette vil sannsynligvis være en av de enkleste Awk-kommandoseksjonene å forstå, så len deg tilbake og la oss komme i gang.

1. Awk-variabler

I et hvilket som helst programmeringsspråk er en variabel en plassholder som lagrer en verdi, når du oppretter en variabel i en programfil, mens filen kjøres, opprettes det noe plass i minnet som vil lagre verdien du spesifiserer for variabelen.

Du kan definere Awk-variabler på samme måte som du definerer skallvariabler som følger:

variable_name=value 

I syntaksen ovenfor:

  1. variabelnavn: er navnet du gir en variabel
  2. verdi: verdien som er lagret i variabelen

La oss se på noen eksempler nedenfor:

computer_name=”linux-console.net”
port_no=”22”
email=”[email ”
server=”computer_name”

Ta en titt på de enkle eksemplene ovenfor, i den første variabeldefinisjonen er verdien linux-console.net tilordnet variabelen datamaskinnavn.

Videre er verdien 22 tilordnet variabelen port_no, det er også mulig å tilordne verdien av en variabel til en annen variabel som i det siste eksempelet hvor vi tilordnet verdien av datamaskinnavn til variabelserveren.

Hvis du husker, fra del 2 av denne Awk-serien hvor vi dekket feltredigering, snakket vi om hvordan Awk deler inn inndatalinjer i felt og bruker standard felttilgangsoperatør, $ for å lese de forskjellige feltene som har blitt analysert. Vi kan også bruke variabler til å lagre verdiene til felt som følger.

first_name=$2
second_name=$3

I eksemplene ovenfor er verdien av first_name satt til andre felt og second_name er satt til det tredje feltet.

Som en illustrasjon kan du vurdere en fil med navnet names.txt som inneholder en liste over brukere av en applikasjon som angir deres for- og etternavn pluss kjønn. Ved å bruke cat-kommandoen kan vi se innholdet i filen som følger:

cat names.txt

Deretter kan vi også bruke variablene first_name og second_name for å lagre for- og andrenavnet til den første brukeren på listen som ved å kjøre Awk kommandoen nedenfor:

awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt

La oss også ta en titt på et annet tilfelle, når du utsteder kommandoen uname -a på terminalen din, skriver den ut all systeminformasjonen din.

Det andre feltet inneholder vertsnavnet, derfor kan vi lagre vertsnavnet i en variabel kalt vertsnavn og skrive det ut med Awk som følger:

uname -a
uname -a | awk '{hostname=$2 ; print hostname ; }' 

2. Numeriske uttrykk

I Awk bygges numeriske uttrykk ved hjelp av følgende numeriske operatorer:

  1. * : multiplikasjonsoperator
  2. + : tilleggsoperator
  3. / : divisjonsoperatør
  4. - : subtraksjonsoperator
  5. % : moduloperator
  6. ^ : eksponentieringsoperator

Syntaksen for et numerisk uttrykk er:

operand1 operator operand2

I skjemaet ovenfor kan operand1 og operand2 være tall eller variabelnavn, og operand er en av operatorene ovenfor.

Nedenfor er noen eksempler for å demonstrere hvordan du bygger numeriske uttrykk:

counter=0
num1=5
num2=10
num3=num2-num1
counter=counter+1

For å forstå bruken av numeriske uttrykk i Awk, skal vi vurdere følgende eksempel nedenfor, med filen domains.txt som inneholder alle domener som eies av Tecmint sterk>.

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

For å se innholdet i filen, bruk kommandoen nedenfor:

cat domains.txt

Hvis vi ønsker å telle antall ganger domenet linux-console.net vises i filen, kan vi skrive et enkelt skript for å gjøre det som følger:

#!/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

Etter å ha opprettet skriptet, lagre det og gjør det kjørbart, når vi kjører det med filen domains.txt som utdata, får vi følgende utdata:

./script.sh  ~/domains.txt

Fra utdataene til skriptet er det 6 linjer i filen domains.txt som inneholder linux-console.net, for å bekrefte at du kan telle dem manuelt.

3. Oppdragsoperatører

Den siste Awk-funksjonen vi skal dekke er oppdragsoperatører, det er flere oppdragsoperatører i Awk, og disse inkluderer følgende:

  1. *= : multiplikasjonstilordningsoperator
  2. += : operatør for tilleggstildeling
  3. /= : operatør for divisjonstildeling
  4. -= : subtraksjonstildelingsoperator
  5. %= : modulustilordningsoperator
  6. ^= : eksponentieringstilordningsoperator

Den enkleste syntaksen for en tildelingsoperasjon i Awk er som følger:

variable_name=variable_name operator operand

Eksempler:

counter=0
counter=counter+1

num=20
num=num-1

Du kan bruke oppgaveoperatorene ovenfor for å forkorte oppgaveoperasjoner i Awk, tenk på de tidligere eksemplene, vi kan utføre oppgaven i følgende form:

variable_name operator=operand
counter=0
counter+=1

num=20
num-=1

Derfor kan vi endre Awk-kommandoen i shell-skriptet vi nettopp skrev ovenfor ved å bruke += tildelingsoperatoren som følger:

#!/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

I dette segmentet av Awk-serien dekket vi noen kraftige Awk-funksjoner, det vil si variabler, bygge numeriske uttrykk og bruke tilordningsoperatorer, pluss noen få illustrasjoner av hvordan vi faktisk kan bruke dem.

Disse konseptene er ikke forskjellige fra det i andre programmeringsspråk, men det kan være noen betydelige forskjeller under Awk-programmering.

I del 9 skal vi se på flere Awk-funksjoner som er spesielle mønstre: BEGIN og END. Inntil da, hold kontakten med Tecmint.