Ich kann tun cat file.txt
, um den Inhalt einer Datei zu erhalten, aber ich möchte auch eine letzte Zeile meiner Wahl anheften.
Ich habe versucht, Rohrleitungen zu verlegen, (cat file.txt ; echo "My final line") |
aber nur die letzte Leitung wird durch die Rohrleitung geführt. Wie kann ich mich der Katze und der letzten Linie anschließen?
Zur Verdeutlichung bearbeiten: Ich möchte die Datei selbst nicht ändern. Ich bin mir bewusst, dass ich, wenn dies der Fall wäre, dies tun könnte echo "My final line" >> file.txt
oder echo "My final line" | tee -a file.txt
aber ich versuche nur, das Anhängen im Kontext dieses bestimmten Befehls durchzuführen, damit ich die Verkettung von file.txt
und weiterleiten kann "My final line"
.
command-line
pipe
cat
echo
DoubleBass
quelle
quelle
echo "My final line" >> file.txt
?>>
wenn ich die Datei selbst bearbeiten möchte.file.txt
? Ihr Pipe Snippet sollte funktionieren.Antworten:
Sie können die
cat
Fähigkeit nutzen, von stdin zu lesen, kombiniert mit der Fähigkeit, mehrere Dateien zu lesen, um dies zu erreichen.Sie können auch eine Zeile als solche voranstellen:
Beachten Sie, dass Sie nicht auf eine einzelne Zeile beschränkt sind.
cat
liest von stdin bis es EOF erreicht. Sie können die Ausgabe voncurl
beispielsweise übergeben, um die Ausgabe von vor oder anzuhängencat
.quelle
(cat file.txt ; echo "My final line") | …
würde es auch tun. Abercat
für das zu verwenden, wofür es entwickelt wurde, ist besser +1.echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | cat
gegen( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cat
oder sogar{ head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat
.Zum Anhängen einer Zeile an eine Datei können Sie einfach den Shell-Append-Umleitungsoperator verwenden
>>
(die Datei wirdopen(2)
mit demO_APPEND
Flag gekennzeichnet):Wenn Sie nur den Inhalt der Datei mit einer angehängten letzten Zeile anzeigen möchten , würde ich
cat
zwei Argumente verwenden:file.txt
cat
nur Dateien behandelt werden), können Sie die Prozessersetzung nutzen<()
, die einen Dateideskriptor zurückgibt (/proc/self/fd/<fd_number>)
.Zusammenfügen:
Wenn Sie möchten, dass die Ausgabe ausgelagert wird, wird davon ausgegangen, dass dies
less
Ihr Lieblings-Pager ist:quelle
<()
funktioniert für Bash, aber für welche anderen Shells funktioniert es? Ksh? Strich?ksh
,zsh
- Ja,dash
- Nein.Aus
man sed
der Option-e
$
stimmt mit der letzten Zeilea
überein und hängt die Zeichenfolge an.Wenn Sie die Zeile dauerhaft an die Datei anhängen möchten, verwenden Sie
-i
Ändern des Befehls in
quelle
Es wurde bereits in den Kommentaren zu der Frage klargestellt, aber als Antwort hier noch einmal hinzugefügt.
Der in der Frage notierte Befehl:
funktioniert wie erwartet - die gesamte Ausgabe der durch die Klammern gebildeten Unterschale wird an den zweiten Befehl weitergeleitet.
Wenn die Datei nicht mit einer neuen Zeile endet, wird die Echo-Zeichenfolge an die letzte Zeile angehängt. Dies ist bei allen anderen Lösungen hier üblich und kann durch Hinzufügen eines weiteren (leeren) Echos zuvor gelöst werden.
quelle
awk
:awk 1 file.txt; echo "My final line"
.awk 1 file
ist ein guter Trick, um fehlende EOL am Ende der Datei zu kompensieren.echo "\nMy final line"
ohne sich darauf verlassen zu müssenawk