Léiert Wéi benotzt Awk Variablen, Numeresch Ausdréck an Assignment Operatoren - Deel 8
D'Awk Kommando Serie gëtt spannend, ech gleewen, an de fréiere siwen Deeler si mir duerch e puer Fundamenter vun Awk gaang, déi Dir musst beherrschen fir datt Dir e puer Basistext- oder Stringfilterung am Linux ausféiert.
Vun dësem Deel un, wäerte mir a Virausberäicher vun Awk tauchen fir méi komplex Text- oder Stringfilteroperatiounen ze handhaben. Dofir wäerte mir Awk Features wéi Variablen, numeresch Ausdréck an Aufgabebetreiber ofdecken.
Dës Konzepter sinn net ëmfaassend z'ënnerscheeden vun deenen, déi Dir wahrscheinlech a ville Programméierungssprooche virun esou Shell begéint hutt, C, Python plus vill anerer, also ass et net néideg vill Suergen iwwer dëst Thema ze maachen, mir iwwerschaffen einfach déi gemeinsam Iddie fir ze benotzen dës ernimmt Fonctiounen.
Dëst wäert wahrscheinlech eng vun den einfachsten Awk Kommando Sektiounen sinn ze verstoen, also sëtzt Iech zréck a loosst lassgoen.
1. Awk Verännerlechen
An all Programméierungssprooch ass eng Variabel e Plazhalter deen e Wäert späichert, wann Dir eng Variabel an enger Programmdatei erstellt, wéi d'Datei ausgefouert gëtt, gëtt e Raum an der Erënnerung erstallt, déi de Wäert späichert deen Dir fir d'Variabel spezifizéiert.
Dir kënnt Awk Variablen definéieren op déiselwecht Manéier wéi Dir Shell Variablen definéiert wéi follegt:
variable_name=value
An der Syntax uewendriwwer:
Variabelnumm
: ass den Numm deen Dir eng Variabel gittWäert
: de Wäert an der Variabel gespäichert
Loosst eis e puer Beispiller hei ënnen kucken:
computer_name=”linux-console.net” port_no=”22” email=”[email ” server=”computer_name”
Kuckt Iech un déi einfach Beispiller hei uewen, an der éischter Variabeldefinitioun gëtt de Wäert linux-console.net
der Variabel Computername
zougewisen.
Ausserdeem gëtt de Wäert 22
der Variabel port_no
zougewisen, et ass och méiglech de Wäert vun enger Variabel un eng aner Variabel ze zouzeschreiwen wéi am leschte Beispill wou mir de Wäert zougewisen hunn vum Computername
op de verännerleche Server.
Wann Dir Iech erënnere kënnt, direkt vum Deel 2 vun dëser Awk Serie wou mir d'Feldbeaarbechtung ofgedeckt hunn, hu mir geschwat wéi Awk Inputlinnen a Felder trennt a benotzt Standard Feldzougangsbedreiwer, $
fir déi verschidde Felder ze liesen déi parséiert gi sinn. Mir kënnen och Variablen benotze fir d'Wäerter vu Felder wéi follegt ze späicheren.
first_name=$2 second_name=$3
An de Beispiller hei uewen ass de Wäert vun first_name
op zweet Feld a second_name
op dat drëtt Feld gesat.
Als Illustratioun, betruecht e Fichier mam Numm names.txt
deen eng Lëscht vun de Benotzer vun enger Applikatioun enthält, déi hir Virnumm a Familljenumm plus Geschlecht uginn. Mat dem Cat Kommando kënne mir den Inhalt vun der Datei kucken wéi follegt:
$ cat names.txt
Dann kënne mir och d'Variabelen first_name
an second_name
benotzen fir den éischten an zweeten Numm vum éischte Benotzer op der Lëscht ze späicheren wéi andeems Dir den Awk Kommando hei drënner leeft:
$ awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt
Loosst eis och en anere Fall kucken, wann Dir de Kommando uname -a
op Ärem Terminal erausgëtt, dréckt se all Är Systeminformatioun aus.
Dat zweet Feld enthält Ären Hostnumm
, dofir kënne mir den Hostnumm an enger Variabel mam Numm Hostname
späicheren an se mat Awk ausdrécken wéi follegt:
$ uname -a $ uname -a | awk '{hostname=$2 ; print hostname ; }'
2. Numeresch Ausdréck
An Awk ginn numeresch Ausdréck mat de folgenden numeresche Bedreiwer gebaut:
*
: Multiplikatiounsoperateur+
: Zousatzoperateur/
: Divisiounsbedreiwer-
: Subtraktiounsoperateur%
: Modulusoperateur^
: Exponentiatiounsoperateur
D'Syntax fir numeresch Ausdréck ass:
$ operand1 operator operand2
An der Form hei uewen, operand1
an operand2
kënnen Zuelen oder Variabelennimm sinn, an Operator
ass ee vun den Betreiber hei uewen.
Drënner sinn e puer Beispiller fir ze demonstréieren wéi een numeresch Ausdréck bauen:
counter=0 num1=5 num2=10 num3=num2-num1 counter=counter+1
Fir d'Benotzung vun numereschen Ausdréck an Awk ze verstoen, wäerte mir dat folgend Beispill hei drënner berücksichtegen, mat der Datei domains.txt
déi all Domänen enthält, déi vum Tecmint gehéiert.
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
Fir den Inhalt vun der Datei ze gesinn, benotzt de Kommando hei ënnen:
$ cat domains.txt
Wa mir d'Zuel vun de Mol wëllen zielen datt d'Domain linux-console.net
an der Datei erschéngt, kënne mir en einfache Skript schreiwen fir dat wéi follegt ze maachen:
#!/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
Nodeems Dir de Skript erstallt hutt, späichert et a maacht et ausführbar, wa mir et mat der Datei lafen, domains.txt
als Out-Input, kréie mir de folgenden Output:
$ ./script.sh ~/domains.txt
Vun der Ausgab vum Skript ginn et 6 Zeilen an der Datei domains.txt
déi linux-console.net
enthalen, fir ze bestätegen datt Dir se manuell ziele kënnt.
3. Aufgab Opérateuren
Déi lescht Awk Feature déi mir ofdecken ass Uerderungsbetreiber, et gi verschidde Uerderungsbetreiber an Awk an dës enthalen déi folgend:
*=
: Multiplikatiounsbedreiwer+=
: Bedreiwer vun der Zousazbezuelung/=
: Bedreiwer vun der Divisiounsbestëmmung-=
: Subtraktiounsbedreiwer%=
: modulus assignment operator^=
: Exponentiatiounsbedreiwer
Déi einfachst Syntax vun enger Uerderungsoperatioun an Awk ass wéi follegt:
$ variable_name=variable_name operator operand
Beispiller:
counter=0 counter=counter+1 num=20 num=num-1
Dir kënnt d'Uweisungsbetreiber hei uewen benotze fir Uerderungsoperatiounen am Awk ze verkierzen, betruecht déi viregt Beispiller, mir kënnen d'Aufgab an der folgender Form ausféieren:
variable_name operator=operand
counter=0 counter+=1 num=20 num-=1
Dofir kënne mir den Awk Kommando am Shell-Skript änneren, dee mir just hei uewen geschriwwen hunn mat +=
Aufgaboperateur wéi follegt:
#!/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
An dësem Segment vun der Awk Serie hu mir e puer mächteg Awk Features ofgedeckt, dat ass Variabelen, numeresch Ausdréck ze bauen an Uweisungsoperateuren ze benotzen, plus e puer Illustratiounen vu wéi mir se tatsächlech kënne benotzen.
Dës Konzepter sinn net anescht wéi déi an anere Programméierungssproochen awer et kënnen e puer bedeitend Ënnerscheeder ënner Awk Programméierung sinn.
Am Deel 9 wäerte mir méi Awk Features kucken, déi speziell Mustere sinn: BEGIN
an END
. Bis dohin, bleift verbonne mat Tecmint.