2013-09-30 5 views
1

Bonjour, J'essaie de créer un script qui me donnera un résumé des activités des groupes de discussion. La plupart de cela fonctionne si loin, sauf lorsque j'essaie d'utiliser l'opérateur correspondant pour voir si ce champ $ 6 correspond à l'expression. Je veux avoir tous les anneaux sous une section. C'est ce que mon script ressemble à:Comment utiliser des expressions régulières dans un script awk?

newsread.awk:

BEGIN{ 
print "\t\t\tNews Reader Summary\n\n" 
printf("    %-15s%-15s%-15s%-15s\n\n","lonestar","runner","ringer","rings"); 
articles[4]; 
groups[4]; 
times[4]; 
cs2413[4];cs2413d[4]; 
} 

NR == 1 {date1 = $1 " " $2 " " $3} 

$6 == "lonestar.jpl.utsa.edu"{ 
    if ($7=="group"){ 
     articles[1]+=$9; 
     if ($8=="utsa.cs.2413"){ 
      cs2413[1]+=$9; 
     } 
     if ($8=="utsa.cs.2413.d"){ 
      cs2413d[1]+=$9; 
     } 
    }else if ($7 == "exit"){ 
     articles[1]+=$9; 
     groups[1]+=$11; 
    }else { 
     times[1]+=$13; 
    } 
} 

$6 == "runner.jpl.utsa.edu"{ 
    if ($7=="group"){ 
       articles[2]+=$9; 
     if ($8=="utsa.cs.2413"){ 
         cs2413[2]+=$9; 
       } 
       if ($8=="utsa.cs.2413.d"){ 
         cs2413d[2]+=$9; 
       } 

     }else if ($7 == "exit"){ 
       articles[2]+=$9; 
       groups[2]+=$11; 
     }else { 
       times[2]+=$13; 
     } 

} 

$6 == "ringer.cs.utsa.edu"{ 
    if ($7=="group"){ 
       articles[3]+=$9; 
     if ($8=="utsa.cs.2413"){ 
         cs2413[3]+=$9; 
       } 
       if ($8=="utsa.cs.2413.d"){ 
         cs2413d[3]+=$9; 
       } 

     }else if ($7 == "exit"){ 
       articles[3]+=$9; 
       groups[3]+=$11; 
     }else { 
       times[3]+=$13; 
     } 

} 

$6 ~ "/ring??.cs.utsa.edu/"{ 
    if ($7=="group"){ 
       articles[4]+=$9; 
     if ($8=="utsa.cs.2413"){ 
         cs2413[4]+=$9; 
       } 
       if ($8=="utsa.cs.2413.d"){ 
         cs2413d[4]+=$9; 
       } 

     }else if ($7 == "exit"){ 
       articles[4]+=$9; 
       groups[4]+=$11; 
     }else { 
       times[4]+=$13; 
     } 

} 
END{ 
    date2 = $1 " " $2 " " $3 
    printf("Articles:  %-15d%-15d%-15d%-15d\n",articles[1],articles[2],articles[3],articles[4]); 
    printf("Groups:  %-15d%-15d%-15d%-15d\n",groups[1],groups[2],groups[3],groups[4]); 
    printf("Cs2413:  %-15d%-15d%-15d%-15d\n",cs2413[1],cs2413[2],cs2413[3],cs2413[4]); 
    printf("Cs2413.d:  %-15d%-15d%-15d%-15d\n",cs2413d[1],cs2413d[2],cs2413d[3],cs2413d[4]); 
    printf("User Time:  %-15d%-15d%-15d%-15d\n",times[1],times[2],times[3],times[4]); 
    printf("\nStart Time = %s\tEnd Time = %s\n",date1,date2); 

} 

Ceci est un extrait de ce news.notice ressemble à:

Feb 13 21:27:14 ringer nnrpd[11474]: lonestar.jpl.utsa.edu group alt.education.distance 19 
Feb 13 21:27:14 ringer nnrpd[11474]: lonestar.jpl.utsa.edu exit articles 19 groups 1 
Feb 13 21:27:14 ringer nnrpd[11474]: lonestar.jpl.utsa.edu times user 0.470 system 0.930 elapsed 4.766 
Feb 13 21:27:49 ringer nnrpd[11462]: ring42.cs.utsa.edu exit articles 0 groups 2 
Feb 13 21:27:49 ringer nnrpd[11462]: ring42.cs.utsa.edu times user 2.020 system 1.430 elapsed 45.114 
Feb 13 21:28:00 ringer nnrpd[11482]: lonestar.jpl.utsa.edu group utsa.lonestar 7 
Feb 13 21:28:00 ringer nnrpd[11482]: lonestar.jpl.utsa.edu exit articles 7 groups 1 
Feb 13 21:28:00 ringer nnrpd[11482]: lonestar.jpl.utsa.edu times user 0.520 system 0.890 elapsed 48.286 
Feb 13 21:28:38 ringer innd: ME running 
Feb 13 21:28:43 ringer nnrpd[11344]: lonestar.jpl.utsa.edu unrecognized NOOP 
Feb 13 21:29:01 ringer nnrpd[11601]: lonestar.jpl.utsa.edu connect 
Feb 13 21:29:01 ringer nnrpd[11601]: lonestar.jpl.utsa.edu exit articles 0 groups 0 
Feb 13 21:29:01 ringer nnrpd[11601]: lonestar.jpl.utsa.edu times user 0.470 system 0.770 elapsed 1.456 
Feb 13 21:29:03 ringer nnrpd[11602]: lonestar.jpl.utsa.edu connect 
Feb 13 21:29:03 ringer nnrpd[11472]: ring29.cs.utsa.edu exit articles 0 groups 0 
Feb 13 21:29:03 ringer nnrpd[11472]: ring29.cs.utsa.edu times user 1.360 system 0.790 elapsed 114.771 
Feb 13 21:29:03 ringer nnrpd[11602]: lonestar.jpl.utsa.edu exit articles 0 groups 0 
Feb 13 21:29:03 ringer nnrpd[11602]: lonestar.jpl.utsa.edu times user 0.530 system 0.650 elapsed 1.524 
Feb 13 21:29:25 ringer nnrpd[11615]: lonestar.jpl.utsa.edu connect 

Et je me sers de cette commande:

awk -f newsread.awk news.notice > newsread.summary 

Et voici newsread.summary:

  News Reader Summary 


       lonestar  runner   ringer   rings   

Articles:  144686   25066   2    0    
Groups:  5282   8344   19    0    
Cs2413:  0    0    0    0    
Cs2413.d:  40    25    0    0    
User Time:  266197   83377   128   0    

Start Time = Feb 13 21:27:14 End Time = Feb 14 20:56:49 

Et ce doit être un script awk.

+0

Les "déclarations" 'articles [4], les groupes [4], les temps [4]; cs2413 [4]; cs2413d [4],' ne sont pas nécessaires et probablement ne faites pas ce que vous pensez qu'ils font. Dans toutes les variétés de awk, il n'est pas nécessaire de déclarer des tableaux, et il n'y a aucun mécanisme pour le faire. Les tableaux apparaissent automatiquement lorsqu'ils sont indexés (ou, dans certaines implémentations awk, quand le script est analysé.) – rici

+0

C'est bon à savoir, merci! Je vais me débarrasser d'eux. – MeesterMarcus

Répondre

2

d'abord se débarrasser des citations, à savoir pas:

$6 ~ "/ring??.cs.utsa.edu/" 

mais ceci:

$6 ~ /ring??.cs.utsa.edu/ 

Citations délimitent des chaînes, des barres obliques délimitent constante REs.

Maintenant, je soupçonne que votre RE est erroné puisque ?? signifie zéro ou 1 répétitions du caractère précédent, puis soit le même à nouveau ou un point d'interrogation littérale (pas sûr - n'a pas de sens de toute façon) et . moyens "un seul caractère". Ceci est une expression régulière, pas un globbing de shell - différents méta-caractères avec des significations différentes.

Vous voulez sans doute ceci:

$6 ~ /^ring..\.cs\.utsa\.edu$/ 
+1

Ça l'a fait! Et vous avez raison, l'expression rationnelle que vous avez fournie fonctionne comme je le voulais. Je vous remercie! – MeesterMarcus

1

Perdez les guillemets.

$6 ~ /regex/ 

pas

$6 ~ "/regex/" 
Questions connexes