2017-05-01 4 views
0

Ich habe die folgende Datei:awk Äquivalent für die Suche nach einem Muster

Schedule Name:  Today 

    Schedule Type:  Standard 
    Active:    yes 
    Effective date:  01/24/2014 11:17:05 
    Client Encrypt:  no 
    LC/CY/Custmr: EU   NY Cindy 
       BU   CA Victor 
       GU   MI Bob 
    Include: 
Schedule Name:  Tomorrow 

    Schedule Type:  Standard 
    Active:    yes 
    Effective date:  01/26/2014 11:17:05 
    Client Encrypt:  no 
    LC/CY/Custmr: MU   LA Martha 
       EU   CA Sam 
    Include: 
Schedule Name:  Yesterday 

    Schedule Type:  Standard 
    Active:    no 
    Effective date:  01/21/2014 11:17:05 
    Client Encrypt:  no 
    LC/CY/Custmr: NV   IL Joe 

    Include: 

gewünschte Ausgabe

Cindy Today 
Victor Today 
Bob  Today 
Martha Tomorrow 
Sam  Tomorrow 

Jetzt habe ich Schedule Name also heute erhalten möchten, morgen zusammen mit Customer name, die das vierte Feld ist wenn Activeyes ist. So soll die Ausgabe sein:

cat billing | 
    awk '/Schedule Name/ || /Active:/ || /LC/,/^$/' | 
    grep -v '^$' 

Eine leere Zeile nach LC ist vor einschließen, so versuche ich, mir alle Daten erhalten, bis Sie eine leere Zeile finden und dann grep -v Leerzeile, Es funktioniert gut, wenn ich versuche, ohne Schedule Name und Active, aber nicht mit diesen 2 Muster suchen.

Ich verwende unten Code, der ziemlich langsam ist.

for pol in `cat /tmp/Active_Policies` 
do 
     count=`sudo /usr/openv/admin/pollist $pol -U | awk '/LC\/CY\/Custmr:/,/Include:/' | grep -v "Include:" | wc -l` 
     if [ $count -gt 0 ] 
     then 
       first=`sudo /usr/openv/admin/pollist $pol -U | awk '/LC\/CY\/Custmr:/,/Include:/' | grep -v "Include:" | awk '{print $4}' | head -1` 
       echo "$first $pol" >> /tmp/Policies_$(date +%m-%d-%Y) 
       counter=1 
       for client in `sudo /usr/openv/admin/pollist $pol -U | awk '/LC\/CY\/Custmr:/,/Include:/' | grep -v "Include:" | awk '{print $3}' | sed '1d;$d'` 
       do 
         ((counter = counter + 1)) 
         if [ $counter -le $count ] 
         then 
           echo "$client $pol" >> /tmp/Policies_$(date +%m-%d-%Y) 
         fi 
       done 
     fi 
done 

Antwort

1

Hier ist der richtige Weg, um Ihr Problem zu nähern:

$ cat tst.awk 
BEGIN { OFS="\t" } 
/^[^[:space:]]/ { prt() } 
NF { 
    if (/:/) { 
     name = $0 
     sub(/:.*/,"",name) 
     gsub(/^[[:space:]]+|[[:space:]]+$/,"",name) 
    } 
    value = $0 
    sub(/^[^:]+:/,"",value) 
    gsub(/^[[:space:]]+|[[:space:]]+$/,"",value) 

    n2v[name,++numVals[name]] = value 
} 
END { prt() } 

function prt() { 
    custFldName = "LC/CY/Custmr" 
    if (n2v["Active",1] == "yes") { 
     sched = n2v["Schedule Name",1] 
     for (valNr=1; valNr<=numVals[custFldName]; valNr++) { 
      cust = n2v[custFldName,valNr] 
      sub(/.*[[:space:]]/,"",cust) 
      print cust, sched 
     } 
    } 
    delete n2v 
    delete numVals 
} 

.

$ awk -f tst.awk file 
Cindy Today 
Victor Today 
Bob  Today 
Martha Tomorrow 
Sam  Tomorrow 

Der Schlüssel ist einen Array (n2v[] oben) zu erstellen, die Namen auf Werte abbildet, wo ein „name“ ist der Text vor den ersten : in jeder Zeile und der zugehörigen „value“ ist, was danach : kommt . Dann drucken Sie einfach die Werte, die Sie interessieren, aus dem Array n2v jedes Mal, wenn Sie eine Schedule Zeile oder das Ende der Eingabedatei treffen.

Verwandte Themen