Zoeken op website

Hoe u Flow Control-verklaringen gebruikt in Awk - Deel 12


Als je alle Awk-voorbeelden bekijkt die we tot nu toe hebben besproken, vanaf het begin van de Awk-serie, zul je merken dat alle opdrachten in de verschillende voorbeelden opeenvolgend worden uitgevoerd, dat wil zeggen de een na de ander. Maar in bepaalde situaties willen we misschien enkele tekstfilterbewerkingen uitvoeren op basis van bepaalde voorwaarden, en dat is waar de aanpak van stroomcontrole-instructies begint.

Er zijn verschillende flow control-instructies in Awk-programmering, waaronder:

  1. if-else verklaring
  2. voor verklaring
  3. terwijl verklaring
  4. do-while-verklaring
  5. verklaring breken
  6. vervolg verklaring
  7. volgende verklaring
  8. nextfile-instructie
  9. exit-verklaring

Voor de reikwijdte van deze serie zullen we echter uiteenzetten: if-else, for, while en do while-instructies. Onthoud dat we al hebben besproken hoe we de volgende verklaring moeten gebruiken in deel 6 van deze Awk-serie.

1. De if-else-verklaring

De verwachte syntaxis van de if-instructie is vergelijkbaar met die van de shell if-instructie:

if  (condition1) {
     actions1
}
else {
      actions2
}

In de bovenstaande syntaxis zijn condition1 en condition2 Awk-expressies, en zijn actions1 en actions2 Awk-opdrachten die worden uitgevoerd wanneer de respectieve voorwaarden zijn voldaan.

Als aan condition1 is voldaan, wat betekent dat het waar is, wordt actions1 uitgevoerd en wordt de if-instructie afgesloten, anders wordt action2 uitgevoerd uitgevoerd.

De if-instructie kan ook worden uitgebreid naar een if-else_if-else-instructie, zoals hieronder:

if (condition1){
     actions1
}
else if (conditions2){
      actions2
}
else{
     actions3
}

Voor het bovenstaande formulier: als condition1 waar is, wordt action1 uitgevoerd en wordt de if-instructie afgesloten, anders wordt condition2 uitgevoerd wordt geëvalueerd en als het waar is, wordt actions2 uitgevoerd en wordt de if-instructie afgesloten. Wanneer condition2 echter onwaar is, wordt actions3 uitgevoerd en wordt de if-instructie afgesloten.

Hier is een voorbeeld van het gebruik van if-statements. We hebben een lijst met gebruikers en hun leeftijden opgeslagen in het bestand, gebruikers .txt.

We willen een verklaring afdrukken waarin de naam van een gebruiker wordt vermeld en of de leeftijd van de gebruiker minder of meer dan 25 jaar oud is.

aaronkilik@tecMint ~ $ cat users.txt
Sarah L			35    	F
Aaron Kili		40    	M
John  Doo		20    	M
Kili  Seth		49    	M    

We kunnen een kort shell-script schrijven om onze taak hierboven uit te voeren, hier is de inhoud van het script:


#!/bin/bash
awk ' { 
        if ( $3 <= 25 ){
           print "User",$1,$2,"is less than 25 years old." ;
        }
        else {
           print "User",$1,$2,"is more than 25 years old" ; 
}
}'    ~/users.txt

Sla vervolgens het bestand op en sluit af, maak het script uitvoerbaar en voer het als volgt uit:

chmod +x test.sh
./test.sh
Voorbeelduitvoer
User Sarah L is more than 25 years old
User Aaron Kili is more than 25 years old
User John Doo is less than 25 years old.
User Kili Seth is more than 25 years old

2. De for-verklaring

Als je enkele Awk-commando's in een lus wilt uitvoeren, dan biedt de for-instructie je een geschikte manier om dat te doen, met de onderstaande syntaxis:

Hier wordt de aanpak eenvoudigweg gedefinieerd door het gebruik van een teller om de uitvoering van de lus te controleren. Eerst moet u de teller initialiseren, deze vervolgens uitvoeren op basis van een testvoorwaarde. Als deze waar is, voert u de acties uit en verhoogt u ten slotte de teller. De lus eindigt wanneer de teller niet aan de voorwaarde voldoet.

for ( counter-initialization; test-condition; counter-increment ){
      actions
}

Het volgende Awk-commando laat zien hoe de for-instructie werkt, waarbij we de getallen 0-10 willen afdrukken:

awk 'BEGIN{ for(counter=0;counter<=10;counter++){ print counter} }'
Voorbeelduitvoer
0
1
2
3
4
5
6
7
8
9
10

3. De while-verklaring

De conventionele syntaxis van de while-instructie is als volgt:

while ( condition ) {
          actions
}

De voorwaarde is een Awk-expressie en acties zijn regels met Awk-opdrachten die worden uitgevoerd wanneer de voorwaarde waar is.

Hieronder staat een script om het gebruik van de whistle-instructie te illustreren om de getallen 0-10 af te drukken:

#!/bin/bash
awk ' BEGIN{ counter=0 ;
         
        while(counter<=10){
              print counter;
              counter+=1 ;
             
}
}  

Sla het bestand op, maak het script uitvoerbaar en voer het vervolgens uit:

chmod +x test.sh
./test.sh
Voorbeelduitvoer
0
1
2
3
4
5
6
7
8
9
10

4. De do while-verklaring

Het is een wijziging van de while-instructie hierboven, met de volgende onderliggende syntaxis:

do {
     actions
}
 while (condition) 

Het kleine verschil is dat onder do while de Awk-opdrachten worden uitgevoerd voordat de voorwaarde wordt geëvalueerd. Met behulp van het voorbeeld onder de while-instructie hierboven kunnen we het gebruik van do while illustreren door het Awk-commando in het test.sh-script te wijzigen als volgt:

#!/bin/bash

awk ' BEGIN{ counter=0 ;  
        do{
            print counter;  
            counter+=1 ;    
        }
        while (counter<=10)   
} 
'

Nadat u het script hebt gewijzigd, slaat u het bestand op en sluit u af. Maak het script vervolgens uitvoerbaar en voer het als volgt uit:

chmod +x test.sh
./test.sh
Voorbeelduitvoer
0
1
2
3
4
5
6
7
8
9
10

Conclusie

Dit is geen alomvattende gids met betrekking tot Awk-stroomcontrole-instructies, zoals ik eerder had vermeld, er zijn verschillende andere stroomcontrole-instructies in Awk.

Niettemin zou dit deel van de Awk-serie u een duidelijk fundamenteel idee moeten geven van hoe de uitvoering van Awk-opdrachten kan worden gecontroleerd op basis van bepaalde omstandigheden.

U kunt net zo goed meer uitleg geven over de rest van de stroomcontroleverklaringen om meer inzicht in het onderwerp te krijgen. Ten slotte zullen we in het volgende deel van de Awk-serie overgaan tot het schrijven van Awk-scripts.