Aggiunta di una riga a un file nel comando cat?


11

Posso fare cat file.txtper ottenere il contenuto di un file ma voglio anche virare su una riga finale di mia scelta.

Ho provato le tubazioni (cat file.txt ; echo "My final line") |ma solo la linea finale viene passata attraverso il tubo. Come posso unirmi al gatto e alla linea finale?

Modifica per un punto di chiarimento: non desidero modificare il file stesso. Sono consapevole che se così fosse potrei fare echo "My final line" >> file.txto echo "My final line" | tee -a file.txtsto solo provando a fare l'appendice nel contesto di questo particolare comando in modo da poter convogliare la concatenazione di file.txte "My final line".


1
Forse qualcosa del genere echo "My final line" >> file.txt?
edwinksl,

Non voglio aggiungere effettivamente la riga all'oggetto file, solo nel comando / piping. So già che posso aggiungere la riga con >>se volevo modificare il file stesso.
DoubleBass

11
Hai cancellato accidentalmente file.txt? Lo snippet di pipe dovrebbe funzionare.
Bracken,

@DoubleBass: la risposta di Mathieu Mitchell è migliore, in quanto non modifica il file (né in memoria né su disco), ma utilizza invece una funzione di un comando integrato.
Bryan Boettcher,

Risposte:


30

Puoi sfruttare catla capacità di leggere da stdin unita alla sua capacità di leggere più file per raggiungere questo obiettivo.

~$ cat file.txt
Hello from file.txt

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

Puoi anche anteporre una riga, come tale:

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

Nota che non sei limitato a una sola riga. catleggerà da stdin fino a raggiungere EOF. È possibile passare l'output da curl, ad esempio, per anteporre o aggiungere all'output di 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>

1
(cat file.txt ; echo "My final line") | …lo farebbe anche. Ma usare catper quello per cui è stato progettato è meglio +1.
ctrl-alt-delor

@ ctrl-alt-delor: le sotto-shell hanno anche lo svantaggio di un processo aggiuntivo da fork che è relativamente costoso. Prova ad esempio echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catcontro ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cato addirittura { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat.
David Foerster,

11

Per aggiungere una riga a un file, è sufficiente utilizzare l'operatore di reindirizzamento append della shell, >>(il file sarà contrassegnato open(2)da O_APPENDflag):

echo 'My final line' >>file.txt

Ora, se vuoi solo visualizzare il contenuto del file con un'ultima riga aggiunta, userei catcon due argomenti:

  • Innanzitutto, il tuo file ovviamente, diciamo file.txt
  • Il secondo argomento sarebbe la stringa di tua scelta e per passare la stringa come un nome di file (poiché cattratta solo i file) puoi sfruttare la sostituzione del processo <(), che restituirebbe un descrittore di file ( /proc/self/fd/<fd_number>).

Mettendo insieme questi:

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

Se vuoi che l'output sia impaginato, supponendo lesssia il tuo cercapersone preferito:

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

<()funziona per bash, ma per quali altri shell funziona? Ksh? Dash?
jpaugh,

1
@jpaugh ksh, zsh- Sì, dash- No.
heemayl

Questo modifica l'originale.
ctrl-alt-delor,

11
sed -e '$aMy final line' file.txt

Dal man sedl'opzione-e

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

$corrisponde all'ultima riga e aaggiunge la stringa.

Se si desidera aggiungere in modo permanente la riga al file, utilizzare -i

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

Modifica del comando in

sed -i -e '$aMy final line' file.txt

1
Usa virgolette singole e non hai bisogno della barra rovesciata.
Wildcard il

7

È stato già chiarito nei commenti alla domanda, ma aggiungendolo di nuovo come risposta qui.

Il comando indicato nella domanda,

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

funziona come previsto: tutto l'output della subshell formato dalle parentesi viene reindirizzato al secondo comando.

Se il file non termina con una nuova riga, la stringa con l'eco viene aggiunta all'ultima riga - questo è comune con tutte le altre soluzioni qui e può essere risolta aggiungendo un'altra (vuota) eco prima.


1
Se il file non termina con un ritorno a capo, userei awk: awk 1 file.txt; echo "My final line". awk 1 fileè un bel trucco per compensare la mancanza di EOL alla fine del file.
muru,

Se il file non termina con una nuova riga, puoi anche utilizzarlo echo "\nMy final line"senza dover dipendere daawk
fregante
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.