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] |