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:
variabelnavn
: er navnet du gir en variabelverdi
: 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:
*
: multiplikasjonsoperator+
: tilleggsoperator/
: divisjonsoperatør-
: subtraksjonsoperator%
: moduloperator^
: 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:
*=
: multiplikasjonstilordningsoperator+=
: operatør for tilleggstildeling/=
: operatør for divisjonstildeling-=
: subtraksjonstildelingsoperator%=
: modulustilordningsoperator^=
: 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.