Vyhledávání na webu

Naučte se používat Awk proměnné, číselné výrazy a operátory přiřazení – část 8


Série příkazů Awk je stále vzrušující Věřím, že v předchozích sedmi dílech jsme prošli některými základy Awk, které musíte zvládnout, abyste v Linuxu mohli provádět základní filtrování textu nebo řetězců.

Počínaje touto částí se ponoříme do pokročilých oblastí Awk, abychom zvládli složitější operace filtrování textu nebo řetězců. Proto se budeme zabývat funkcemi Awk, jako jsou proměnné, číselné výrazy a operátory přiřazení.

Tyto koncepty nejsou zcela odlišné od těch, se kterými jste se pravděpodobně setkali v mnoha programovacích jazycích před takovým shellem, C, Python a mnoha dalšími, takže není třeba se tímto tématem příliš zabývat, pouze revidujeme běžné myšlenky použití tyto zmíněné vlastnosti.

Toto bude pravděpodobně jedna z nejsnáze pochopitelných částí příkazu Awk, takže se pohodlně usaďte a pusťte se do toho.

1. Awk proměnné

V jakémkoli programovacím jazyce je proměnná zástupný symbol, který ukládá hodnotu. Když vytvoříte proměnnou v souboru programu, při spuštění souboru se v paměti vytvoří prostor, který uloží hodnotu, kterou pro proměnnou zadáte.

Proměnné Awk můžete definovat stejným způsobem, jakým definujete proměnné prostředí takto:

variable_name=value 

Ve výše uvedené syntaxi:

  1. název_proměnné: je název, který zadáte proměnné
  2. value: hodnota uložená v proměnné

Podívejme se na několik příkladů níže:

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

Podívejte se na jednoduché příklady výše, v první definici proměnné je proměnné název_počítače přiřazena hodnota linux-console.net.

Dále je proměnné port_no přiřazena hodnota 22, je také možné přiřadit hodnotu jedné proměnné jiné proměnné jako v posledním příkladu, kde jsme přiřadili hodnotu z název_počítače na server proměnné.

Pokud si vzpomínáte, hned od části 2 této série Awk, kde jsme se zabývali editací polí, jsme hovořili o tom, jak Awk rozděluje vstupní řádky do polí a používá standardní operátor přístupu k polím $ ke čtení různých polí, která byly analyzovány. Můžeme také použít proměnné k uložení hodnot polí následovně.

first_name=$2
second_name=$3

Ve výše uvedených příkladech je hodnota first_name nastavena na druhé pole a second_name je nastavena na třetí pole.

Jako příklad si vezměte soubor s názvem names.txt, který obsahuje seznam uživatelů aplikace s uvedením jejich jména, příjmení a pohlaví. Pomocí příkazu cat můžeme zobrazit obsah souboru následovně:

cat names.txt

Pak můžeme také použít proměnné first_name a second_name k uložení křestního a druhého jména prvního uživatele na seznamu, jako když spustíte Awk příkaz níže:

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

Podívejme se také na další případ, kdy na terminálu zadáte příkaz uname -a, vypíše všechny vaše systémové informace.

Druhé pole obsahuje váš hostname, proto můžeme hostname uložit do proměnné s názvem hostname a vytisknout pomocí Awk takto:

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

2. Číselné výrazy

V Awk se číselné výrazy vytvářejí pomocí následujících číselných operátorů:

  1. * : operátor násobení
  2. + : operátor sčítání
  3. / : operátor dělení
  4. - : operátor odčítání
  5. % : operátor modulu
  6. ^ : operátor umocňování

Syntaxe pro číselné výrazy je:

operand1 operator operand2

Ve výše uvedeném formuláři mohou být operand1 a operand2 čísla nebo názvy proměnných a operátor je kterýkoli z výše uvedených operátorů.

Níže uvádíme několik příkladů, které demonstrují, jak vytvářet číselné výrazy:

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

Abychom porozuměli použití číselných výrazů v Awk, zvážíme následující příklad níže se souborem domains.txt, který obsahuje všechny domény vlastněné 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

Chcete-li zobrazit obsah souboru, použijte příkaz níže:

cat domains.txt

Pokud chceme spočítat, kolikrát se v souboru objeví doména linux-console.net, můžeme k tomu napsat 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 vytvoření skriptu jej uložte a udělejte z něj spustitelný, když jej spustíme se souborem domains.txt jako výstupním vstupem, dostaneme následující výstup:

./script.sh  ~/domains.txt

Z výstupu skriptu je v souboru domains.txt, které obsahují linux-console.net, 6 řádků, které potvrzují, že je můžete ručně spočítat.

3. Operátoři přiřazení

Poslední funkcí Awk, kterou se budeme zabývat, jsou operátory přiřazení, v Awk existuje několik operátorů přiřazení a mezi ně patří následující:

  1. *= : operátor přiřazení násobení
  2. += : operátor přiřazení sčítání
  3. /= : operátor přiřazení dělení
  4. -= : operátor přiřazení odčítání
  5. %= : operátor přiřazení modulu
  6. ^= : operátor přiřazení umocnění

Nejjednodušší syntaxe operace přiřazení v Awk je následující:

variable_name=variable_name operator operand

Příklady:

counter=0
counter=counter+1

num=20
num=num-1

Operátory přiřazení výše můžete použít ke zkrácení operací přiřazení v Awk, zvažte předchozí příklady, přiřazení bychom mohli provést v následujícím tvaru:

variable_name operator=operand
counter=0
counter+=1

num=20
num-=1

Proto můžeme změnit příkaz Awk ve skriptu shellu, který jsme právě napsali výše, pomocí operátoru přiřazení += 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 segmentu série Awk jsme se zabývali některými výkonnými funkcemi Awk, tj. proměnnými, vytvářením číselných výrazů a používáním operátorů přiřazení, plus několik ilustrací toho, jak je můžeme skutečně používat.

Tyto koncepty se nijak neliší od konceptů v jiných programovacích jazycích, ale v programování Awk mohou existovat určité významné rozdíly.

V části 9 se podíváme na další funkce Awk, což jsou speciální vzory: BEGIN a END. Do té doby zůstaňte ve spojení se službou Tecmint.