Lær hvordan du bruger Awk-variabler, numeriske udtryk og tildelingsoperatører - Del 8


Awk-kommandaserien bliver spændende. Jeg tror, i de foregående syv dele gik vi gennem nogle grundlæggende i Awk, som du har brug for at mestre for at gøre det muligt for dig at udføre grundlæggende tekst eller strengfiltrering i Linux.

Fra og med denne del skal vi dykke ned i områder i Awk for at håndtere mere komplekse tekst- eller strengfiltreringsoperationer. Derfor skal vi dække Awk-funktioner såsom variabler, numeriske udtryk og tildelingsoperatorer.

Disse begreber adskiller sig ikke helt fra dem, du sandsynligvis har stødt på i mange programmeringssprog, før en sådan shell, C, Python plus mange andre, så der er ingen grund til at bekymre sig meget om dette emne, vi reviderer simpelthen de almindelige ideer om at bruge disse nævnte funktioner.

Dette vil sandsynligvis være en af de nemmeste Awk-kommandosektioner at forstå, så læn dig tilbage og lad os komme i gang.

1. Awk-variabler

På ethvert programmeringssprog er en variabel en pladsholder, der gemmer en værdi, når du opretter en variabel i en programfil, når filen udføres, oprettes der noget plads i hukommelsen, der gemmer den værdi, du angiver for variablen.

Du kan definere Awk-variabler på samme måde, som du definerer shell-variabler som følger:

variable_name=value 

I syntaksen ovenfor:

  1. variable_name : er det navn, du giver en variabel
  2. værdi : den værdi, der er gemt i variablen

Lad os se på nogle eksempler nedenfor:

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

Se på de enkle eksempler ovenfor, i den første variabeldefinition er værdien linux-console.net tildelt variablen computernavn .

Desuden tildeles værdien 22 til variablen port_no , det er også muligt at tildele værdien af en variabel til en anden variabel som i det sidste eksempel, hvor vi tildelte værdien af computernavn til den variable server.

Hvis du kan huske, lige fra del 2 af denne Awk-serie, hvor vi dækkede feltredigering, talte vi om, hvordan Awk deler inputlinjer i felter og bruger standard feltadgangsoperatør, $ til at læse de forskellige felter, der er blevet analyseret. Vi kan også bruge variabler til at gemme værdierne for felter som følger.

first_name=$2
second_name=$3

I eksemplerne ovenfor er værdien af first_name indstillet til andet felt og second_name er indstillet til det tredje felt.

Som en illustration kan du overveje en fil med navnet names.txt , der indeholder en liste over applikationsbrugere, der angiver deres for- og efternavne plus køn. Ved hjælp af cat-kommandoen kan vi se indholdet af filen som følger:

$ cat names.txt

Derefter kan vi også bruge variablerne first_name og second_name til at gemme første og andet navn på den første bruger på listen som ved at køre kommandoen Awk nedenfor:

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

Lad os også se på en anden sag, når du udsteder kommandoen uname -a på din terminal, udskriver den al din systeminformation.

Det andet felt indeholder dit værtsnavn , derfor kan vi gemme værtsnavnet i en variabel kaldet værtsnavn og udskrive det ved hjælp af Awk som følger:

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

2. Numeriske udtryk

I Awk er numeriske udtryk bygget ved hjælp af følgende numeriske operatorer:

  1. * : multiplikationsoperator
  2. + : tilføjelsesoperator
  3. /: divisionsoperatør
  4. - : subtraktionsoperator
  5. % : moduloperator
  6. ^: eksponentieringsoperatør

Syntaksen for et numerisk udtryk er:

$ operand1 operator operand2

I ovenstående form kan operand1 og operand2 være tal eller variabelnavne, og operator er en af operatorerne ovenfor.

Nedenfor er nogle eksempler for at demonstrere, hvordan man bygger numeriske udtryk:

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

For at forstå brugen af numeriske udtryk i Awk skal vi overveje følgende eksempel nedenfor med filen domains.txt , der indeholder alle domæner, der ejes af Tecmint.

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

Brug kommandoen nedenfor for at se indholdet af filen:

$ cat domains.txt

Hvis vi vil tælle antallet af gange, domænet linux-console.net vises i filen, kan vi skrive et simpelt script for at gøre det som følger:

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

Når du har oprettet scriptet, skal du gemme det og gøre det eksekverbart, når vi kører det med filen domains.txt som input, får vi følgende output:

$ ./script.sh  ~/domains.txt

Fra output af scriptet er der 6 linjer i filen domains.txt , der indeholder linux-console.net , for at bekræfte, at du manuelt kan tælle dem.

3. Opgaveoperatører

Den sidste Awk-funktion, vi skal dække, er tildelingsoperatører, der er flere tildelingsoperatører i Awk, og disse inkluderer følgende:

  1. * = : multiplikationstildelingsoperator
  2. + = : tildelingsopgaveoperatør
  3. /= : opdelingstildelingsoperatør
  4. - = : subtraktionstildelingsoperatør
  5. % = : modulus-tildelingsoperator
  6. ^= : eksponentieringstildelingsoperatør

Den enkleste syntaks for en tildelingsoperation 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 bruge tildelingsoperatorerne ovenfor til at forkorte tildelingshandlinger i Awk. Overvej de tidligere eksempler, vi kunne udføre opgaven i følgende form:

variable_name operator=operand
counter=0
counter+=1

num=20
num-=1

Derfor kan vi ændre Awk-kommandoen i shell-scriptet, som vi lige skrev ovenfor ved hjælp af + = tildelingsoperatøren som følger:

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

I dette segment af Awk-serien dækkede vi nogle kraftige Awk-funktioner, det vil sige variabler, der bygger numeriske udtryk og bruger tildelingsoperatorer plus nogle få illustrationer af, hvordan vi rent faktisk kan bruge dem.

Disse begreber adskiller sig ikke fra begrebet i andre programmeringssprog, men der kan være nogle væsentlige forskelle under Awk-programmering.

I del 9 skal vi se på flere Awk-funktioner, der er specielle mønstre: BEGIN og END . Indtil da skal du forblive forbundet med Tecmint.