Ich versuche zu verwenden awk
, um den Namen einer Datei mit dem absoluten Pfad zur Datei zu erhalten.
Wenn /home/parent/child/filename
ich beispielsweise den Eingabepfad angegeben habe, den ich erhalten möchte, habe filename
ich Folgendes versucht:
awk -F "/" '{print $5}' input
das funktioniert perfekt.
Ich bin jedoch hart codiert, $5
was falsch wäre, wenn meine Eingabe die folgende Struktur hätte:
/home/parent/child1/child2/filename
Für eine generische Lösung muss also immer das letzte Feld (der Dateiname) verwendet werden.
Gibt es eine einfache Möglichkeit, dies mit der awk substr-Funktion zu tun?
basename
ist die Verwendung der offiziellen Methode, dies zu verwenden,awk
ist nicht gut, um es leicht auszudrücken. : DAntworten:
Verwenden Sie die Tatsache, dass
awk
die Linien in Felder basierend auf einem Feldtrennzeichen aufgeteilt werden, das Sie definieren können. Wenn/
Sie also das Feldtrennzeichen definieren, können Sie sagen:In
NF
Bezug auf die Anzahl der Felder des aktuellen Datensatzes$NF
bedeutet Drucken das Drucken des letzten.Also gegeben eine Datei wie diese:
Dies wäre die Ausgabe:
quelle
$(NF-1)
.In diesem Fall ist es besser zu verwenden
basename
alsawk
:quelle
dirname
macht das Gegenteil und streift Datei nicht den Pfad.Eine andere Option ist die Verwendung der
bash
Parametersubstitution .quelle
Wenn Sie offen für eine Perl-Lösung sind, finden Sie hier eine, die der awk-Lösung von fedorqui ähnelt:
-F/
Spezifiziert/
als Feldtrennzeichen$F[-1]
ist das letzte Element in dem@F
Autosplit - Arrayquelle
Es sollte ein Kommentar zur Antwort auf den Basisnamen sein, aber ich habe nicht genug Sinn.
Wenn Sie keine doppelten Anführungszeichen verwenden,
basename
funktioniert dies nicht mit Pfaden, bei denen Leerzeichen vorhanden sind:ok mit Anführungszeichen ""
Dateibeispiel
quelle
Ich weiß, dass ich 3 Jahre zu spät dran bin, aber ... Sie sollten die Parametererweiterung in Betracht ziehen, sie ist eingebaut und schneller.
Wenn sich Ihre Eingabe in einer Variablen befindet, sagen wir einfach $ var1
${var1##*/}
. Schau untenquelle
Wie 5 Jahre zu spät, ich weiß, danke für all die Vorschläge, ich habe dies folgendermaßen gemacht:
Ich bin froh zu bemerken, dass es bessere Manieren gibt
quelle
Sie können auch verwenden:
oder
quelle