Anhängen einer Zeile an eine Datei im Befehl cat?

11

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.txtoder echo "My final line" | tee -a file.txtaber ich versuche nur, das Anhängen im Kontext dieses bestimmten Befehls durchzuführen, damit ich die Verkettung von file.txtund weiterleiten kann "My final line".

DoubleBass
quelle
1
Vielleicht so etwas echo "My final line" >> file.txt?
Edwinksl
Ich möchte die Zeile nicht wirklich an das Dateiobjekt anhängen, sondern nur im Befehl / in der Rohrleitung. Ich weiß bereits, dass ich die Zeile anhängen kann, >>wenn ich die Datei selbst bearbeiten möchte.
DoubleBass
11
Haben Sie versehentlich gelöscht file.txt? Ihr Pipe Snippet sollte funktionieren.
Bracken
@DoubleBass: Die Antwort von Mathieu Mitchell ist besser, da die Datei nicht geändert wird (weder im Arbeitsspeicher noch auf der Festplatte), sondern stattdessen die Funktion eines integrierten Befehls verwendet wird.
Bryan Boettcher

Antworten:

30

Sie können die catFähigkeit nutzen, von stdin zu lesen, kombiniert mit der Fähigkeit, mehrere Dateien zu lesen, um dies zu erreichen.

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

Sie können auch eine Zeile als solche voranstellen:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

Beachten Sie, dass Sie nicht auf eine einzelne Zeile beschränkt sind. catliest von stdin bis es EOF erreicht. Sie können die Ausgabe von curlbeispielsweise übergeben, um die Ausgabe von vor oder anzuhängen cat.

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>
Mathieu Mitchell
quelle
1
(cat file.txt ; echo "My final line") | …würde es auch tun. Aber catfür das zu verwenden, wofür es entwickelt wurde, ist besser +1.
Strg-Alt-Delor
@ ctrl-alt-delor: Unterschalen haben auch den Nachteil eines zusätzlichen Prozesses zum Gabeln, der relativ teuer ist. Versuchen Sie es zum Beispiel echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catgegen ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | catoder sogar { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat.
David Foerster
11

Zum Anhängen einer Zeile an eine Datei können Sie einfach den Shell-Append-Umleitungsoperator verwenden >>(die Datei wird open(2)mit dem O_APPENDFlag gekennzeichnet):

echo 'My final line' >>file.txt

Wenn Sie nur den Inhalt der Datei mit einer angehängten letzten Zeile anzeigen möchten , würde ich catzwei Argumente verwenden:

  • Zunächst Ihre Datei, sagen wir mal file.txt
  • Das zweite Argument wäre die Zeichenfolge Ihrer Wahl. Um die Zeichenfolge als Dateinamen zu übergeben (da catnur Dateien behandelt werden), können Sie die Prozessersetzung nutzen <(), die einen Dateideskriptor zurückgibt ( /proc/self/fd/<fd_number>).

Zusammenfügen:

cat file.txt <(echo 'My final line')

Wenn Sie möchten, dass die Ausgabe ausgelagert wird, wird davon ausgegangen, dass dies lessIhr Lieblings-Pager ist:

less file.txt <(echo 'My final line')
heemayl
quelle
<()funktioniert für Bash, aber für welche anderen Shells funktioniert es? Ksh? Strich?
Jpaugh
1
@jpaugh ksh, zsh- Ja, dash- Nein.
heemayl
Dies ändert das Original.
Strg-Alt-Delor
11
sed -e '$aMy final line' file.txt

Aus man sedder Option-e

-e script, --expression=script
    add the script to the commands to be executed

$stimmt mit der letzten Zeile aüberein und hängt die Zeichenfolge an.

Wenn Sie die Zeile dauerhaft an die Datei anhängen möchten, verwenden Sie -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

Ändern des Befehls in

sed -i -e '$aMy final line' file.txt
Katu
quelle
1
Verwenden Sie einfache Anführungszeichen und Sie benötigen keinen Backslash.
Wildcard
7

Es wurde bereits in den Kommentaren zu der Frage klargestellt, aber als Antwort hier noch einmal hinzugefügt.

Der in der Frage notierte Befehl:

(cat file.txt ; echo "My final line") | other command

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.

Paŭlo Ebermann
quelle
1
Wenn die Datei nicht mit einem Zeilenumbruch endet, würde ich Folgendes verwenden awk: awk 1 file.txt; echo "My final line". awk 1 fileist ein guter Trick, um fehlende EOL am Ende der Datei zu kompensieren.
Muru
Wenn die Datei nicht mit einer neuen Zeile endet, können Sie sie auch einfach verwenden, echo "\nMy final line"ohne sich darauf verlassen zu müssenawk
fregante