2013-09-30 3 views
1

Привет Я пытаюсь создать сценарий, который даст мне резюме деятельности в новостных группах. Большинство из них работает до сих пор, за исключением тех случаев, когда я пытаюсь использовать оператор сопоставления, чтобы увидеть, соответствует ли это поле $ 6 выражению. Я хочу, чтобы все кольца были под одной частью. Это то, что выглядит мой сценарий, как:Как использовать регулярные выражения в 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); 

} 

Это фрагмент того, что news.notice выглядит следующим образом:

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 

И я использую эту команду:

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

А вот 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 

И это должен быть сценарий awk.

+0

"описаний" 'статья [4]; группы [4]; раз [4]; cs2413 [4]; cs2413d [4];' не является необходимой и вероятно, не делают то, что, по вашему мнению, они делают. Во всех разновидностях awk нет необходимости объявлять массивы, и для этого нет механизма. Массивы возникают автоматически, когда они индексируются (или, в некоторых реализациях awk, когда скрипт разбирается.) – rici

+0

Это полезно знать, спасибо! Я избавлюсь от них. – MeesterMarcus

ответ

2

сначала избавиться от кавычек, то есть не так:

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

но:

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

Цитаты разграничивать строки, слэши разграничить константа местожительство

Теперь, я подозреваю, что ваш RE ошибочен, так как ?? означает ноль или 1 повторение предыдущего символа, а затем либо тот же самый, либо буквальный знак вопроса (не уверен, что - не имеет смысла в любом случае) и . означает «любой отдельный символ». Это регулярное выражение, а не чередование оболочки - разные метасимволы с разными значениями.

Вы, вероятно, хотите вместо этого:

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

Это было! И ваше правильное, регулярное выражение, которое вы предоставили, работает так, как я этого хотел. Спасибо! – MeesterMarcus

1

Потерять двойные кавычки.

$6 ~ /regex/ 

не

$6 ~ "/regex/" 
Смежные вопросы