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".


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>

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')

<()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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.