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:
- 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.
- 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ő:
- Ha egy szkriptben a
BEGINmintá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. - Ezután egy bemeneti sort beolvasunk, és a különböző mezőkbe elemezzük.
- 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.
- Ezután a 2. és 3. szakasz megismétlődik az összes bemeneti vonalon.
- Ha az összes bemeneti sort elolvasta és kezelte, ha megadja a
ENDmintá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.



