Ich habe eine Akte
xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
"/home/path/to/file1": Permission denied (13) rsync:
"/home/path/to/file2": Permission denied (13) rsync:
"/home/path/to/file3": Permission denied (13)
Jetzt möchte ich nur die Dateipfade extrahieren und in einer anderen Datei speichern. Ausgabedatei ist wie folgt:
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
Mit sed oder awk wie kann ich das machen?
Ich habe es versucht, sed -n '/"/,/"/p' myfile
aber es funktioniert nicht.
Antworten:
Sie können stderr Ihres rsync-Befehls an ein awk-Skript übergeben:
Oder zu einem Befehl wie diesem:
quelle
cut -d\" -f2
"
und"
auf stderr.$1
; alles zwischen dem ersten und dem zweiten Anführungszeichen ist$2
; und alles nach dem zweiten doppelten Anführungszeichen ist in$3
($4
, ...). Der Dateiname steht (anscheinend) immer zwischen den ersten beiden Anführungszeichen, daher sollte diese Lösung funktionieren (und tat es, als ich sie getestet habe).Verwenden von
sed
:Das sucht nach: Zeilenanfang, einer Reihe von Nicht-Anführungszeichen, einem doppelten Anführungszeichen, einer Reihe von Nicht-Anführungszeichen, einem doppelten Anführungszeichen und allem anderen in der Zeile und ersetzt es durch das erfasste Material.
Testen Sie auf RHEL 5 Linux mit GNU
sed
, aber nur mit Funktionen, die in der 7. Edition von UNIX ™ funktionieren würdensed
.Eine etwas einfachere Möglichkeit ist übrigens die Verwendung von zwei Ersatzbefehlen. ändere alles bis einschließlich des ersten Anführungszeichens in eine leere Zeichenkette (das ist eine Folge von null oder mehr nicht Anführungszeichen, gefolgt von einem doppelten Anführungszeichen); ändere alles nach dem, was jetzt das erste doppelte Anführungszeichen ist, in nichts:
Übrigens druckt der von Ihnen ausgeführte Befehl (`sed -n '/" /, / "/ p') von einer Zeile mit einem doppelten Anführungszeichen in die nächste Zeile mit einem doppelten Anführungszeichen, ohne die Zeilen zu bearbeiten. Aus diesem Grund schien es bei Ihnen nicht zu funktionieren - es hat getan, was Sie gefragt haben, aber was Sie von ihm verlangt haben, war nicht das, was Sie von ihm verlangt haben.
In Bezug auf die Effizienz ist es unwahrscheinlich, dass es einen messbaren Unterschied in der Leistung gibt. In Bezug auf die Wartungsfreundlichkeit vermute ich, dass letztere die Gehirnzellen weniger belastet.
quelle
Wenn Ihre Version von
grep
Perl-regexp unterstützt:Ergebnisse:
Sie können dies auch weniger streng gestalten, um bei Bedarf eine Übereinstimmung zwischen den Doppel zu erzielen:
quelle
.*
Non-Gierige mit.*?
nur für den Fall machen, dass es später in der Zeile ein zusätzliches doppeltes Anführungszeichen gibt? Oder[^"]*
anstelle von verwenden.*
?Verwenden Sie den Operator >>, um alle Ausgaben in einer Datei zu speichern.
Mögen
Ändern Sie dies einfach für Ihr spezifisches Szenario, indem Sie sed anhängen
zum Befehl
quelle
grep -r
führt eine rekursive Suche durch alle in den Argumenten (*
) aufgelisteten Verzeichnisse durch . Es ist nicht klar, welches Muster Sie im Sinn haben, aber esgrep
wird die ganze Linie erfassen. Der Zweck der Übung besteht darin, Informationen aus einem Teil einer Zeile zu sammeln. Wenn Sie GNU verwendengrep
, gibt es Möglichkeiten, dies zu tun (-o
); Diese sind nicht standardisiert (außer insofern, als GNU einen De-facto-Standard definiert). Ähnliches gilt für die Verwendung von regulären PCRE-Ausdrücken. Das sind andere GNU-Erweiterungen. Sie sind in Ordnung, wenn Sie GNU habengrep
und nicht vorhaben, auf Plattformen zu arbeiten, auf denen GNUgrep
nicht standardmäßig verfügbar ist.