Mogę zrobić, cat file.txt
aby 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.txt
albo echo "My final line" | tee -a file.txt
ale ja tylko próbuje zrobić append w kontekście tego konkretnego polecenia więc mogę rura w konkatenacji file.txt
i "My final line"
.
command-line
pipe
cat
echo
DoubleBass
źródło
źródło
echo "My final line" >> file.txt
?>>
jeśli chcę edytować sam plik.file.txt
? Twój fragment rury powinien działać.Odpowiedzi:
Możesz wykorzystać
cat
zdolność czytania ze standardowego wejścia w połączeniu z możliwością odczytu wielu plików, aby to osiągnąć.Możesz również wstawić linię jako taką:
Pamiętaj, że nie jesteś ograniczony do jednej linii.
cat
odczyta ze standardowego wejścia, aż osiągnie EOF. Możesz przekazać dane wyjściowe zcurl
, na przykład, aby dodać lub dołączyć do danych wyjściowychcat
.źródło
(cat file.txt ; echo "My final line") | …
też by to zrobił. Ale użyciecat
tego, do czego zostało zaprojektowane, jest lepsze +1.echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | cat
kontra( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cat
lub nawet{ head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat
.Aby dodać linię do pliku, możesz po prostu użyć operatora przekierowania dołączania powłoki
>>
(plik zostanieopen(2)
oznaczonyO_APPEND
flagą):Teraz, jeśli chcesz tylko wyświetlić zawartość pliku z dołączonym ostatnim wierszem, użyłbym
cat
dwóch argumentów:file.txt
cat
dotyczy tylko plików), możesz zastosować podstawienie procesu<()
, co zwróci deskryptor pliku (/proc/self/fd/<fd_number>)
.Zestawiając je razem:
Jeśli chcesz, aby wynik był stronicowany, zakładając, że
less
jest to twój ulubiony pager:źródło
<()
działa na bash, ale dla jakich innych powłok działa? Ksh? Dziarskość?ksh
,zsh
- Tak,dash
- Nie.Z
man sed
opcji-e
$
dopasowuje ostatni wiersz ia
dołącza ciąg.Jeśli chcesz na stałe dołączyć linię do pliku, użyj
-i
Zmiana polecenia na
źródło
Zostało to już wyjaśnione w komentarzach do pytania, ale dodając je ponownie jako odpowiedź tutaj.
Polecenie zanotowane w pytaniu
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.
źródło
awk
:awk 1 file.txt; echo "My final line"
.awk 1 file
to niezła sztuczka, aby zrekompensować brak EOL na końcu pliku.echo "\nMy final line"
bez koniecznościawk