Jak mogę zobaczyć cały plik, a także poczekać, aż do tego pliku doda się więcej danych?

21

Chcę odczytać cały plik i sprawić, by czekał na dane wejściowe, tak jak tail -f z wyświetlonym kompletnym plikiem.

Długość tego pliku zawsze się zmienia, ponieważ jest to .logplik.

Jak mogę to zrobić, jeśli nie znam długości pliku?

malworm
źródło
2
wiesz już, że ogon jest blisko tego, czego chcesz. czy przeczytałeś stronę man dla tego?
njzk2
1
lessma klawisz „F”. Przydatne, jeśli potrzebujesz interakcji.
Thorbjørn Ravn Andersen

Odpowiedzi:

33

tailpozwala dodać, -naby określić liczbę linii do wyświetlenia od końca, których można używać w połączeniu z -f. Jeśli argumentem -nrozpoczynającym się od +tego jest liczba wierszy od początku ( 0i 1wyświetlenie całego pliku, 2co oznacza pominięcie pierwszego wiersza, jak wskazuje @Ben). Więc po prostu zrób:

tail -f -n +0 filename

Jeśli pliki dziennika się obracać, można dodać --retry(lub połączyć -f and --retrysię -Fjak sugeruje @Hagen)

Zauważ również, że w graficznym terminalu możesz użyć myszy i PageUp/, PageDownaby przewinąć z powrotem do historii (zakładając, że twój bufor jest wystarczająco duży), ta informacja pozostaje tam, nawet jeśli używasz Ctrl+, Caby wyjść tail. Jeśli używasz lesstego, jest to znacznie mniej wygodne i AFAIK musisz używać klawiatury do przewijania, a ja nie wiem, jak powstrzymać się lessod dezinicjalizacji termcap, jeśli zapomnisz go uruchomić -X.

Anthon
źródło
1
+1 Twoja odpowiedź pojawiła się, gdy tylko opublikowałem moją i chociaż moja działa, twoja jest lepsza.
Julie Pelletier
1
Dostałem wiadomość, kiedy jeszcze pisałem, że jest tam inna odpowiedź i że powinienem kliknąć, aby odświeżyć. Twoja odpowiedź wykona zadanie, ale nie zdziwiłbym się, że liczenie od początku (wymuszone przez +) jest realizowane bardziej efektywnie.
Anthon
1
+1za nauczenie mnie o +0. -FZamiast -frotacyjnych logów możesz chcieć
Hagen von Eitzen
Myślę, że jest tu osobno. tail -n +1pokazuje mi początek pliku i tail -n +2pomija jedną linię. Myślę, że ten numer jest numerem pierwszego wyświetlanego wiersza.
Ben Millwood
1
@Anthon dzięki! Właśnie tego potrzebuję!
malworm
37

Jest lepszy sposób na osiągnięcie tego celu:

less +F <file>

Pokaże cały plik, ma pełną moc lessi będzie czekać na nowe dane wejściowe. Jeśli chcesz przestać czekać na dane wejściowe i przeczytać określoną część, możesz ją zatrzymać ^Ci wznowić za pomocą F.

FKomenda jest zawsze dostępny less, jeśli zdecydujesz się obserwować zmiany mając otwarte w pliku less, uderzając Fbędzie go włączyć. Dzięki hiergiltdiestfu i symbol wieloznaczny za wskazanie tego.

Leandros
źródło
2
To jest rzeczywiście znacznie lepsze niż tail. Dzięki za wskazówkę; Nigdy bym nie pomyślał o użyciu lessdo tego. Uwaga dla innych: Możesz także uruchomić, less <file>a następnie wpisać F.
Wildcard
3

Oprócz odpowiedzi / u / Anthon możesz zrobić coś takiego:

{ cat filename; tail -0f filename; }

Ta -0opcja tail jest równoważna -n 0, co oznacza: dispaly 0 linii. Ale -fwyświetli nowe linie.

Nie potrzebujesz aparatów ortodontycznych { }. Użyłem ich, ponieważ czasami chcesz w jakiś sposób przekierować deskryptory plików. Na przykład:

{ cat ; tail -0f -; } < /var/log/messages

Zauważony przez Bena Milwooda: możesz mieć stan wyścigu, w którym plik rośnie między końcem catoperacji a początkiem tailoperacji. Ale znowu jest to „akademicki” problem rozwiązania akademickiego.

Otheus
źródło
3
Jeśli plik rośnie między catkońcem a tailpoczątkiem, nie zobaczysz tych linii. Jest mało prawdopodobne, aby była to wielka sprawa, ale powód, aby preferować czyste tailrozwiązanie.
Ben Millwood
Myślę, że { cat; tail -n +0 -f; } < fileto naprawi wyścig, ponieważ ogon wydrukuje wszelkie nowe dane, które pojawią się między catwyjściem a tailstartem. Oczywiście czyni to catzbędnym. Przekierowanie odbywa się tylko raz, a tailstdin to deskryptor pliku, który catjuż odczytał EOF, więc jego bieżąca pozycja jest tam, gdzie jest catzatrzymana. Możesz to przetestować, umieszczając echo foo >> filewewnątrz {}, aby za każdym razem stworzyć wyścig.
Peter Cordes
2

watch polecenie powinno zrobić to za ciebie.

Możesz także spróbować

less +FG 

Będziesz miał więcej opcji z lesspoleceniem do przewijania pliku, gdy mówisz, że jest to duży plik.

RajuBhai
źródło
Mniej też nie podąża za rosnącym plikiem.
Shadur
7
@Shadur, tak, właśnie taka +Fjest opcja
glenn jackman