Pracujte s premennými, výrazmi a operátormi Awk


Séria príkazov Awk je čoraz vzrušujúcejšia! Verím, že v predchádzajúcich siedmich častiach sme prešli niektorými základmi Awk, ktoré musíte zvládnuť, aby ste mohli vykonávať základné filtrovanie textu alebo reťazcov v Linuxe.

Počnúc touto časťou sa ponoríme do pokročilých oblastí Awk, aby sme zvládli zložitejšie operácie filtrovania textu alebo reťazcov. Preto sa budeme zaoberať funkciami Awk, ako sú premenné, numerické výrazy a operátory priradenia.

Tieto koncepty sa výrazne nelíšia od tých, s ktorými ste sa už mohli stretnúť v mnohých programovacích jazykoch, ako sú Shell, C, Python a mnohé ďalšie. O túto tému sa teda netreba veľmi starať; jednoducho revidujeme bežné myšlienky používania týchto funkcií.

Toto bude pravdepodobne jedna z najjednoduchších častí príkazu Awk, ktorú pochopíte, takže sa pohodlne usaďte a poďme na to

1. Awk premenné

V akomkoľvek programovacom jazyku je premenná zástupný symbol, ktorý ukladá hodnotu. Keď vytvoríte premennú v programovom súbore, počas vykonávania súboru sa v pamäti vytvorí priestor, ktorý bude uchovávať hodnotu, ktorú zadáte pre premennú.

Premenné Awk môžete definovať rovnakým spôsobom, ako definujete premenné shellu takto:

variable_name=value 

Vo vyššie uvedenej syntaxi:

  • názov_premennej: je názov, ktorý zadáte premennej.
  • value: hodnota uložená v premennej.

Pozrime sa na niekoľko príkladov nižšie:

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

Pozrite si jednoduché príklady vyššie, v prvej definícii premennej je premennej názov_počítača priradená hodnota linux-console.net.

Ďalej je premennej port_no priradená hodnota 22, je tiež možné priradiť hodnotu jednej premennej inej premennej ako v poslednom príklade, kde sme priradili hodnotu z názov_počítača na server premennej.

Ak si pamätáte, hneď od časti 2 tejto série Awk, kde sme sa zaoberali úpravou polí, sme hovorili o tom, ako Awk rozdeľuje vstupné riadky do polí a používa štandardný operátor prístupu k poli, $ na čítanie rôznych polia, ktoré boli analyzované. Premenné môžeme použiť aj na uloženie hodnôt polí nasledovne.

first_name=$2
second_name=$3

Vo vyššie uvedených príkladoch je hodnota first_name nastavená na druhé pole a second_name je nastavená na tretie pole.

Ako ilustráciu si predstavte súbor s názvom names.txt, ktorý obsahuje zoznam používateľov s uvedením ich mena, priezviska a pohlavia.

Pomocou príkazu cat môžeme obsah súboru zobraziť nasledovne

cat names.txt

Potom môžeme tiež použiť premenné first_name a second_name na uloženie mena a priezviska prvého používateľa v zozname, napríklad spustením Awk príkaz nižšie:

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

Pozrime sa tiež na ďalší prípad, keď na svojom termináli zadáte príkaz uname -a, vypíše všetky vaše systémové informácie.

Druhé pole obsahuje váš názov hostiteľa, preto môžeme názov hostiteľa uložiť do premennej názov hostiteľa a vytlačiť pomocou Awk takto:

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

2. Číselné výrazy

V Awk sa číselné výrazy vytvárajú pomocou nasledujúcich číselných operátorov:

  • * : operátor násobenia
  • + : operátor sčítania
  • / : operátor delenia
  • - : operátor odčítania
  • % : operátor modulu
  • ^ : operátor umocňovania

Syntax pre číselný výraz je:

operand1 operator operand2

Vo vyššie uvedenom formulári môžu byť operand1 a operand2 čísla alebo názvy premenných a operátor je ktorýkoľvek z vyššie uvedených operátorov.

Nižšie uvádzame niekoľko príkladov, ktoré demonštrujú, ako vytvoriť číselné výrazy:

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

Aby sme porozumeli použitiu číselných výrazov v Awk, zvážime nasledujúci príklad nižšie so súborom domains.txt, ktorý obsahuje všetky domény vlastnené Tecmint silný>.

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

Ak chcete zobraziť obsah súboru, použite príkaz nižšie:

cat domains.txt

Ak chceme spočítať, koľkokrát sa v súbore objaví doména linux-console.net, môžeme na to napísať jednoduchý skript takto:

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

Po vytvorení skriptu ho uložte a spravte ho spustiteľným, keď ho spustíme so súborom domains.txt ako naším vstupom, dostaneme nasledujúci výstup:

./script.sh  ~/domains.txt

Z výstupu skriptu je 6 riadkov v súbore domains.txt, ktoré obsahujú linux-console.net, aby ste potvrdili, že ich môžete spočítať ručne.

3. Operátori pridelenia

Poslednou funkciou Awk, ktorou sa budeme zaoberať, sú operátory priradenia, v Awk je niekoľko operátorov priradenia, medzi ktoré patria:

  • *= : operátor priradenia násobenia
  • += : operátor priradenia sčítania
  • /= : operátor priradenia delenia
  • -= : operátor priradenia odčítania
  • %= : operátor priradenia modulu
  • ^= : operátor priradenia umocňovania

Najjednoduchšia syntax operácie priradenia v Awk je nasledovná:

variable_name=variable_name operator operand

Príklady:

counter=0
counter=counter+1

num=20
num=num-1

Operátory priradenia vyššie môžete použiť na skrátenie operácií priradenia v Awk, zvážte predchádzajúce príklady, priradenie by sme mohli vykonať v nasledujúcom tvare:

variable_name operator=operand
counter=0
counter+=1

num=20
num-=1

Preto môžeme zmeniť príkaz Awk v skripte shellu, ktorý sme práve napísali vyššie, pomocou operátora priradenia += takto:

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

V tomto segmente série príkazov Awk sme sa zaoberali niektorými výkonnými funkciami Awk, ktorými sú premenné, vytváranie číselných výrazov a používanie operátorov priradenia, plus niekoľko ilustrácií toho, ako ich môžeme skutočne použiť.

Tieto koncepty sa nijako nelíšia od konceptov v iných programovacích jazykoch, ale v rámci programovania Awk môžu existovať určité významné rozdiely.

V časti 9 sa pozrieme na ďalšie funkcie Awk, ktoré sú špeciálnymi vzormi: BEGIN a END. Dovtedy zostaňte v spojení so službou Tecmint.

Pre tých, ktorí hľadajú komplexný zdroj, sme všetky články zo série Awk skompilovali do knihy, ktorá obsahuje 13 kapitol a má 41 strán a zahŕňa základné aj pokročilé používanie Awk s praktickými príkladmi.

Product Name Price Buy
eBook: Introducing the Awk Getting Started Guide for Beginners $8.99 [Buy Now]