Antworten:
Sie könnten dafür verwenden awk
.
command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
>
druckt alle Ausgaben in die Datei und überschreibt vorhandene Dateien. Es wird nicht so ausgewertet, dass neue Zeilen alte Ausgaben derselben Instanz von überschreiben awk
. Das heißt, wenn es mehrere Übereinstimmungen gibt, enthält die Datei "Übereinstimmung" jede Übereinstimmung, die durch getrennt ist OFS
. Der Unterschied zwischen >
und >>
besteht in der Behandlung vorhandener Dateien.
Hier ein sed
Beispiel:
Hinweis: Der w
Befehl sed überschreibt bei jeder Ausführung des Skripts eine vorhandene Datei, jedoch nur, wenn dieser bestimmte Schreibbefehl ausgelöst wird. daher dierm
rm -f file-{yes,not}
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file
sed -n '/PATTERN/p;//! w file-not' infile >file-yes
Sie können Dateien in awk anhängen:
awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }
oder kürzer:
awk '{print >>(/pattern/?"matched":"unmatched")}'
awk
aber an welchem Punkt wertet es das aus>
? Wenn es jedes Mal ausgewertet wird, wenn die Bedingung zutrifft, erhalten Sie zwei einzeilige Dateien ...