Weboldal keresés

Tanulja meg az Awk speciális minták „BEGIN and END” használatát – 9. rész


Ennek az Awk-sorozatnak a 8. részében bemutattunk néhány hatékony Awk parancsszolgáltatást, például változókat, numerikus kifejezéseket és hozzárendelési operátorokat.

Ahogy haladunk előre, ebben a szegmensben több Awk szolgáltatásra fogunk kiterjedni, ezek pedig a speciális minták: BEGIN és END.

Ezek a speciális funkciók hasznosnak bizonyulnak majd, amikor megpróbáljuk továbbfejleszteni és felfedezni az összetett Awk műveletek felépítésének további módszereit.

Kezdésként tereljük vissza gondolatainkat az Awk sorozat bevezetéséhez, ne feledjük, amikor elindítottuk ezt a sorozatot, rámutattam, hogy az Awk futtatásának általános szintaxisa > parancs a következő:

awk 'script' filenames  

A fenti szintaxisban pedig az Awk szkript a következő formában van:

/pattern/ { actions } 

Ha figyelembe vesszük a szkriptben lévő mintát, az általában egy reguláris kifejezés, emellett a mintára úgy is gondolhatunk, mint speciális BEGIN és END mintára. Ezért az alábbi formában is írhatunk egy Awk parancsot:

awk '
 	BEGIN { actions } 
 	/pattern/ { actions }
 	/pattern/ { actions }
            ……….
	 END { actions } 
' filenames  

Abban az esetben, ha speciális mintákat használ: BEGIN és END egy Awk szkriptben, ezek mindegyike ezt jelenti:

  1. BEGIN minta: azt jelenti, hogy az Awk a beviteli sorok beolvasása előtt egyszer végrehajtja a BEGIN mezőben megadott művelet(eke)t.
  2. END minta: azt jelenti, hogy az Awk végrehajtja az END-ben megadott művelet(eke)t, mielőtt ténylegesen kilépne.

Az ezeket a speciális mintákat tartalmazó Awk parancsszkript végrehajtási folyamata pedig a következő:

  1. Ha egy szkriptben a BEGIN mintát használják, a BEGIN összes művelete egyszer végrehajtásra kerül, mielőtt bármelyik beviteli sor beolvasásra kerül.
  2. Ezután egy bemeneti sort beolvasunk, és a különböző mezőkbe elemezzük.
  3. Ezután a megadott nem speciális minták mindegyikét összehasonlítja az egyezés bemeneti sorával, és ha talál egyezést, akkor az adott mintához tartozó művelet(ek) végrehajtásra kerül. Ez a szakasz megismétlődik az összes megadott mintánál.
  4. Ezután a 2. és 3. szakasz megismétlődik az összes bemeneti vonalon.
  5. Ha az összes bemeneti sort elolvasta és kezelte, ha megadja a END mintát, a művelet(ek) végrehajtásra kerülnek.

Mindig emlékeznie kell erre a végrehajtási sorrendre, amikor speciális mintákkal dolgozik, hogy a legjobb eredményeket érje el az Awk műveletben.

Hogy mindezt megértsük, a 8. rész példájával szemléltetjük a Tecmint tulajdonában lévő, a domains.txt nevű fájlban tárolt domainek listáját.

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
cat ~/domains.txt

Ebben a példában meg akarjuk számolni, hogy a linux-console.net domain hányszor szerepel a domains.txt fájlban. Ezért írtunk egy kis shell szkriptet, amely segít nekünk ebben, a változók, numerikus kifejezések és hozzárendelési operátorok ötletével, amelynek tartalma a következő:

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

Használjuk most a két speciális mintát: BEGIN és END az Awk parancsban a fenti szkriptben a következőképpen:

Megváltoztatjuk a forgatókönyvet:

awk '/^linux-console.net/ { counter+=1 ; printf "%s\n", counter ; }' $file

Nak nek :

awk ' style="color: yellow;">BEGIN {  print "The number of times linux-console.net appears in the file is:" ; }
                      /^linux-console.net/ {  counter+=1  ;  }
                      style="color: yellow;">END {  printf "%s\n",  counter  ; } 
                    '  $file

Az Awk parancs módosítása után a teljes shell-szkript így néz ki:

#!/bin/bash
for file in $@; do
        if [ -f $file ] ; then
                #print out filename
                echo "File is: $file"
                #print the total number of times linux-console.net appears in the file
                awk ' style="color: yellow;">BEGIN {  print "The number of times linux-console.net appears in the file is:" ; }
                      /^linux-console.net/ {  counter+=1  ;  }
                      style="color: yellow;">END {  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

Amikor a fenti szkriptet futtatjuk, először a domains.txt fájl helyét írja ki, majd az Awk parancsszkriptet hajtja végre, ahol a BEGIN speciális minta segít nekünk kinyomtatni a „A linux-console.net hányszor jelenik meg a fájlban: ” üzenetet, mielőtt bármilyen beviteli sor beolvasásra kerülne a fájlból.

Ezután a /^linux-console.net/ mintánkat összehasonlítjuk minden bemeneti sorral és a { counter+=1 ; A } minden egyes beviteli sorhoz lefut, amely számolja, hogy a linux-console.net hányszor jelenik meg a fájlban.

Végül az END minta kinyomtatja, hogy hányszor jelenik meg a linux-console.net domain a fájlban.

./script.sh ~/domains.txt 

Befejezésül további Awk funkciókon mentünk keresztül, amelyek a speciális minták fogalmát kutatják: BEGIN és END.

Amint arra már korábban rámutattam, ezek az Awk-funkciók segítenek bonyolultabb szövegszűrési műveletek felépítésében, az Awk-funkciók alatt még többről van szó, és a 10. részben a Az Awk beépített változóinak ötlete, tehát maradjon kapcsolatban.

Kapcsolódó cikkek: