Opi käyttämään Awk-muuttujia, numeerisia lausekkeita ja määritysoperaattoreita - Osa 8


Awk-komentosarjasta on tulossa jännittävä. Uskon, että edellisessä seitsemässä osassa kävimme läpi joitain Awkin perusasioita, jotka sinun on hallittava, jotta voit suorittaa perustekstin tai merkkijonon suodatuksen Linuxissa.

Tästä osasta alkaen sukeltamme Awk:n edistyneisiin alueisiin monimutkaisempien teksti- tai merkkijonosuodatustoimintojen käsittelemiseksi. Siksi aiomme kattaa Awk-ominaisuudet, kuten muuttujat, numeeriset lausekkeet ja määritysoperaattorit.

Nämä käsitteet eivät eroa kattavasti niistä, joita olet luultavasti kohdannut monissa ohjelmointikielissä ennen tällaista shelliä, C:tä, Pythonia ja monia muita, joten tästä aiheesta ei tarvitse huolehtia, vaan tarkistamme yleisiä käyttöideoita. nämä mainitut ominaisuudet.

Tämä on luultavasti yksi helpoimmin ymmärrettävistä Awk-komento-osista, joten istu alas ja lähde liikkeelle.

1. Awk-muuttujat

Millä tahansa ohjelmointikielellä muuttuja on paikkamerkki, joka tallentaa arvon, kun luot muuttujan ohjelmatiedostoon, kun tiedostoa suoritetaan, muistiin syntyy tilaa, joka tallentaa muuttujalle määrittämäsi arvon.

Voit määrittää Awk-muuttujat samalla tavalla kuin määrität kuorimuuttujat seuraavasti:

variable_name=value 

Yllä olevassa syntaksissa:

  1. muuttujan_nimi: on nimi, jonka annat muuttujalle
  2. arvo: muuttujaan tallennettu arvo

Katsotaanpa joitain esimerkkejä alla:

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

Katso yllä olevia yksinkertaisia esimerkkejä. Ensimmäisessä muuttujan määritelmässä muuttujalle tietokoneen_nimi on määritetty arvo linux-console.net.

Lisäksi muuttujalle port_no on annettu arvo 22, on myös mahdollista määrittää yhden muuttujan arvo toiselle muuttujalle kuten edellisessä esimerkissä, jossa määritimme arvon tietokoneen_nimi muuttujapalvelimelle.

Jos muistat, heti tämän Awk-sarjan osassa 2, kun käsittelimme kenttämuokkausta, puhuimme siitä, kuinka Awk jakaa syöttörivit kenttiin ja käyttää tavallista kenttäkäyttöoperaattoria $ lukemaan eri kentät, jotka on jäsennetty. Voimme myös käyttää muuttujia kenttien arvojen tallentamiseen seuraavasti.

first_name=$2
second_name=$3

Yllä olevissa esimerkeissä first_name-arvon arvo on asetettu toiseen kenttään ja toinen_nimi-arvo on asetettu kolmanteen kenttään.

Esimerkkinä kannattaa harkita tiedostoa nimeltä names.txt, joka sisältää luettelon sovelluksen käyttäjistä sekä heidän etu- ja sukunimensä sekä sukupuolensa. Cat-komennolla voimme tarkastella tiedoston sisältöä seuraavasti:

cat names.txt

Sitten voimme myös käyttää muuttujia first_name ja second_name tallentaaksemme luettelon ensimmäisen käyttäjän etu- ja toisen nimen, kuten suorittamalla Awk. > komento alla:

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

Tarkastellaanpa myös toista tapausta, jossa komento uname -a päätteessäsi tulostaa kaikki järjestelmätietosi.

Toinen kenttä sisältää isäntänimesi, joten voimme tallentaa isäntänimesi muuttujaan nimeltä hostname ja tulostaa sen käyttämällä Awka. > seuraavasti:

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

2. Numeeriset lausekkeet

Awkissa numeeriset lausekkeet luodaan käyttämällä seuraavia numeerisia operaattoreita:

  1. * : kertooperaattori
  2. + : lisäysoperaattori
  3. : jako-operaattori
  4. - : vähennyslaskuoperaattori
  5. % : moduulioperaattori
  6. ^ : eksponentiooperaattori

Numeeristen lausekkeiden syntaksi on:

operand1 operator operand2

Yllä olevassa muodossa operand1 ja operand2 voivat olla numeroita tai muuttujien nimiä, ja operaattori on mikä tahansa yllä olevista operaattoreista.

Alla on joitain esimerkkejä numeeristen lausekkeiden rakentamisesta:

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

Ymmärtääksemme numeeristen lausekkeiden käyttöä Awkissa tarkastelemme seuraavaa esimerkkiä, jossa on tiedosto domains.txt, joka sisältää kaikki Tecmintin omistamat verkkotunnukset. vahva>.

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

Voit tarkastella tiedoston sisältöä käyttämällä alla olevaa komentoa:

cat domains.txt

Jos haluamme laskea, kuinka monta kertaa verkkotunnus linux-console.net esiintyy tiedostossa, voimme kirjoittaa yksinkertaisen komentosarjan seuraavasti:

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

Kun olet luonut skriptin, tallenna se ja tee siitä suoritettava. Kun suoritamme sen tiedoston domains.txt kanssa ulostulona, saamme seuraavan tulosteen:

./script.sh  ~/domains.txt

Komentosarjan tulosteen tiedostossa domains.txt on 6 riviä, jotka sisältävät linux-console.net, vahvistamaan, että voit laskea ne manuaalisesti.

3. Tehtäväoperaattorit

Viimeinen Awk-ominaisuus, jota käsittelemme, ovat määritysoperaattorit, Awkissa on useita määritysoperaattoreita, ja niihin kuuluvat seuraavat:

  1. *= : kertolaskuoperaattori
  2. += : lisäysoperaattori
  3. /= : divisioonan määritysoperaattori
  4. -= : vähennyslaskutehtävä
  5. %= : moduulin määritysoperaattori
  6. ^= : eksponentiomäärityksen operaattori

Yksinkertaisin Awk:n määritystoiminnon syntaksi on seuraava:

variable_name=variable_name operator operand

Esimerkkejä:

counter=0
counter=counter+1

num=20
num=num-1

Voit käyttää yllä olevia toimeksiantooperaattoreita lyhentääksesi määritystoimintoja Awkissa, harkitse aiempia esimerkkejä, voimme suorittaa tehtävän seuraavassa muodossa:

variable_name operator=operand
counter=0
counter+=1

num=20
num-=1

Siksi voimme muuttaa Awk-komentoa komentotulkkikomentosarjassa, jonka juuri kirjoitimme yllä käyttämällä +=-määritysoperaattoria seuraavasti:

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

Tässä Awk-sarjan osassa käsittelimme joitain tehokkaita Awk-ominaisuuksia, eli muuttujia, numeeristen lausekkeiden rakentamista ja osoitusoperaattoreiden käyttöä, sekä muutamia esimerkkejä siitä, kuinka voimme todella käyttää niitä.

Nämä käsitteet eivät eroa muissa ohjelmointikielissä olevista käsitteistä, mutta Awk-ohjelmoinnissa voi olla joitain merkittäviä eroja.

Osassa 9 tarkastellaan lisää Awk-ominaisuuksia, jotka ovat erikoismalleja: BEGIN ja END. Pysy siihen asti yhteydessä Tecmintiin.