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:
-
variable_name
: er det navn, du giver en variabel -
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:
-
*
: multiplikationsoperator -
+
: tilføjelsesoperator -
/
: divisionsoperatør -
-
: subtraktionsoperator -
%
: moduloperator -
^
: 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:
-
* =
: multiplikationstildelingsoperator -
+ =
: tildelingsopgaveoperatør -
/=
: opdelingstildelingsoperatør -
- =
: subtraktionstildelingsoperatør -
% =
: modulus-tildelingsoperator -
^=
: 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.