
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"'
-l
setzt 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 mode
gefolgt von einer beliebigen Anzahl von Zeichen, die keine Zeilenumbrüche sind, enthält, drucken Sie die Übereinstimmung ($&
) oderNA
andernfalls.
Im Grunde das Gleiche wie@iruvars awk-Lösung, aber in perl
.
Antwort2
Mit awk
im 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 RSTART
und RLENGTH
. Wenn RSTART
ungleich Null ist, wird die Teilzeichenfolge entsprechend RSTART
und RLENGTH
gedruckt, andernfalls NA
wird 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>