Dołączasz wiersz do pliku w poleceniu cat?

12

Mogę zrobić, cat file.txtaby uzyskać zawartość pliku, ale chcę również zająć się ostatnią linią, którą sam wybiorę.

Próbowałem rurociągów, (cat file.txt ; echo "My final line") |ale tylko ostatnia linia przechodzi przez rurę. Jak mogę dołączyć do kota i ostatniej linii?

Edycja w celu wyjaśnienia: nie chcę modyfikować samego pliku. Zdaję sobie sprawę, że gdyby tak było nie mogłem zrobić echo "My final line" >> file.txtalbo echo "My final line" | tee -a file.txtale ja tylko próbuje zrobić append w kontekście tego konkretnego polecenia więc mogę rura w konkatenacji file.txti "My final line".

DoubleBass
źródło
1
Może coś takiego echo "My final line" >> file.txt?
edwinksl
Nie chcę faktycznie dołączać wiersza do obiektu pliku, tylko w poleceniu / potoku. Wiem już, że mogę dodać linię, >>jeśli chcę edytować sam plik.
DoubleBass
11
Czy przypadkowo usunąłeś file.txt? Twój fragment rury powinien działać.
Bracken
@DoubleBass: Odpowiedź Mathieu Mitchella jest lepsza, ponieważ nie modyfikuje pliku (ani w pamięci, ani na dysku), ale zamiast tego wykorzystuje funkcję wbudowanego polecenia.
Bryan Boettcher

Odpowiedzi:

30

Możesz wykorzystać catzdolność czytania ze standardowego wejścia w połączeniu z możliwością odczytu wielu plików, aby to osiągnąć.

~$ cat file.txt
Hello from file.txt

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

Możesz również wstawić linię jako taką:

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

Pamiętaj, że nie jesteś ograniczony do jednej linii. catodczyta ze standardowego wejścia, aż osiągnie EOF. Możesz przekazać dane wyjściowe z curl, na przykład, aby dodać lub dołączyć do danych wyjściowych 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
źródło
1
(cat file.txt ; echo "My final line") | …też by to zrobił. Ale użycie cattego, do czego zostało zaprojektowane, jest lepsze +1.
ctrl-alt-delor
@ ctrl-alt-delor: Sub-powłoki mają również wadę dodatkowego procesu rozwidlania, który jest stosunkowo drogi. Spróbuj na przykład echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catkontra ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | catlub nawet { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat.
David Foerster
12

Aby dodać linię do pliku, możesz po prostu użyć operatora przekierowania dołączania powłoki >>(plik zostanie open(2)oznaczony O_APPENDflagą):

echo 'My final line' >>file.txt

Teraz, jeśli chcesz tylko wyświetlić zawartość pliku z dołączonym ostatnim wierszem, użyłbym catdwóch argumentów:

  • Po pierwsze, powiedzmy, twój plik file.txt
  • Drugim argumentem byłby wybrany przez Ciebie ciąg, a aby przekazać go jako nazwę pliku (ponieważ catdotyczy tylko plików), możesz zastosować podstawienie procesu <(), co zwróci deskryptor pliku ( /proc/self/fd/<fd_number>).

Zestawiając je razem:

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

Jeśli chcesz, aby wynik był stronicowany, zakładając, że lessjest to twój ulubiony pager:

less file.txt <(echo 'My final line')
heemayl
źródło
<()działa na bash, ale dla jakich innych powłok działa? Ksh? Dziarskość?
jpaugh
1
@jpaugh ksh, zsh- Tak, dash- Nie.
heemayl
To modyfikuje oryginał.
ctrl-alt-delor
11
sed -e '$aMy final line' file.txt

Z man sedopcji-e

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

$dopasowuje ostatni wiersz i adołącza ciąg.

Jeśli chcesz na stałe dołączyć linię do pliku, użyj -i

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

Zmiana polecenia na

sed -i -e '$aMy final line' file.txt
Katu
źródło
1
Używaj pojedynczych cudzysłowów i nie potrzebujesz odwrotnego ukośnika.
Wildcard,
7

Zostało to już wyjaśnione w komentarzach do pytania, ale dodając je ponownie jako odpowiedź tutaj.

Polecenie zanotowane w pytaniu

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

działa zgodnie z oczekiwaniami - wszystkie dane wyjściowe z podpowłoki utworzonej w nawiasach są przesyłane do drugiego polecenia.

Jeśli plik nie kończy się na nowej linii, ciąg echa jest dołączany do ostatniej linii - jest to wspólne dla wszystkich innych rozwiązań tutaj i może być rozwiązane przez dodanie wcześniejszego (pustego) echa.

Paŭlo Ebermann
źródło
1
Jeśli plik nie kończy się nową linią, użyję awk: awk 1 file.txt; echo "My final line". awk 1 fileto niezła sztuczka, aby zrekompensować brak EOL na końcu pliku.
muru
Jeśli plik nie kończy się na nowej linii, możesz go również użyć echo "\nMy final line"bez konieczności awk
polegania