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:

  1. Variabelnumm: ass den Numm deen Dir eng Variabel gitt
  2. Wä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:

  1. * : Multiplikatiounsoperateur
  2. +: Zousatzoperateur
  3. / : Divisiounsbedreiwer
  4. - : Subtraktiounsoperateur
  5. % : Modulusoperateur
  6. ^ : 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:

  1. *= : Multiplikatiounsbedreiwer
  2. += : Bedreiwer vun der Zousazbezuelung
  3. /= : Bedreiwer vun der Divisiounsbestëmmung
  4. -= : Subtraktiounsbedreiwer
  5. %= : modulus assignment operator
  6. ^= : 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.