Ich versuche, Zeilen zu drucken, die eine übereinstimmende Zeichenfolge haben, möchte aber auch "NA" für die anderen Zeilen drucken

Ich versuche, Zeilen zu drucken, die eine übereinstimmende Zeichenfolge haben, möchte aber auch "NA" für die anderen Zeilen drucken

Ich habe eine Datei, die ungefähr so ​​aussieht:

Volume1  
created=Monday  
blah blah  
foo foo  
lock mode=exclusive  
ops  
layer id=1  

Volume2  
created=Tuesday  
jibber jabber  
foo foo  
ops  
layer id=2  

Volume3  
created=Wednesday  
blaaah  
foooo  
lock mode=shared  
ops  
layer id=3

Ich möchte nach „Sperrmodus“ suchen und, wenn dieser vorhanden ist, die ganze Zeile drucken, andernfalls möchte ich „NA“ drucken. Ich kann anscheinend nicht herausfinden, wie ich etwas für nicht übereinstimmende Zeilen drucken kann. Ich bin sicher, dass awk oder sed das auch könnten.

Ich habe Code ausprobiert, der dem folgenden ähnelt:

grep -A6 Volume | grep "lock mode" <file>

Für dieses Beispiel möchte ich, dass die Ausgabe Folgendes anzeigt:

lock mode=exclusive  
NA  
lock mode=shared

Antwort1

Ganz einfach mit perl:

perl -l -00 -ne 'print /lock mode.*/ ? $& : "NA"'
  • -lsetzt das Ausgabefeldtrennzeichen auf eine neue Zeile
  • -00: Absatzmodus (Datensätze sind Absätze)
  • -ne code: Code für jeden Eingabedatensatz ausführen
  • Wenn der Datensatz lock modegefolgt von einer beliebigen Anzahl von Zeichen, die keine Zeilenumbrüche sind, enthält, drucken Sie die Übereinstimmung ( $&) oder NAandernfalls.

Im Grunde das Gleiche wie@iruvars awk-Lösung, aber in perl.

Antwort2

Mit awkim Absatzmodus

awk -v RS= '{match($0, /lock mode=[^\n]+/); 
  print RSTART? substr($0, RSTART, RLENGTH): "NA"}' file

Das RS=bewirkt, dass jeder Absatz als ein einzelner Datensatz behandelt wird. Der Aufruf vonübereinstimmenfüllt die Koordinaten von lock mode=....in vordefinierte Variablen RSTARTund RLENGTH. Wenn RSTARTungleich Null ist, wird die Teilzeichenfolge entsprechend RSTARTund RLENGTHgedruckt, andernfalls NAwird gedruckt

Antwort3

Mit GNUsed

sed -n '
    /Volume/!d
    :a
    n
    /lock mode/{
        p
        d
        }
    /^\s*$/!ba
    c\NA
    ' <file>

Mitawk

awk '
    BEGIN{
        FS="\n"
        RS="\n\n"
    }
    /lock mode/{
        for(i=1;i<=NF;i++)
            if($i ~ /lock mode/)
                print $i
        next
    }
    {
        print "NA"
    }
    ' <file>

verwandte Informationen