Jak zmienić / grep / awk ostatnie N bajtów pliku zamiast linii


14

Mam aplikację, która loguje się do zwykłego pliku dziennika (myapp.log), ale wydaje się, że nie zapisuje nowych znaków wiersza na końcu każdego wpisu dziennika. Jeśli wykonam polecenie tak tail -n 50 myapp.log, jak w rzeczywistości otrzymuję setki „wierszy” tekstu (wpisów w dzienniku).

Ten plik dziennika jest bardzo duży, około 1 GB, kto wie, jak dawno wstawiono ostatni CR i / lub LF. Jak mogę po prostu powiedzieć, na przykład, ostatnie 2 MB?

Odpowiedzi:


27

Za pomocą -cprzełącznika (2 MB = 2 * 1024 * 1024 = 2097152 bajtów):

tail -c 2097152 myapp.log

Dzięki Petr Uzel za sugestię. Niektóre implementacje tail pozwalają na dodanie jednostki do drukowania ostatnich kilobajtów (k) lub megabajtów (m), takich jak:

tail -c 2m myapp.log

Należy jednak pamiętać, że nie jest to standard (w żadnym z POSIX, UNIX (SUS) lub Linux (LSB)) i nie jest przenośny. Zwróć też uwagę, że ponieważ terminy „Mega” / „kilo” ... i ich skróty (M, k ...) mają niejednoznaczne znaczenie (1000 vs 1024), nie ma dużej gwarancji, co to lub ta implementacja tailbędzie oznaczać 2m(chociaż obecne wersje obecnych implementacji, które ją obsługują, wydają się działać w wariancie 1024).


5
Ogon powinien być w stanie zaakceptować liczbę z jednostkami jako argumentem przełącznika c, więc tail -c 2M myapp.logpowinien również działać.
Petr Uzel

@PetrUzel: Dzięki. Edytowałem odpowiedź, aby ją dodać.
Birei

Teraz czuję się głupio :) Dzięki za szybkość, naprawdę to doceniam. Świetna sugestia!
jwbensley

1
Idealnie, nie jestem pewien, czy to pomoże, ale dodam ten ciąg tekstowy, ponieważ to właśnie słowa kluczowe szukałem tutaj (zajęło mi to sporo czasu): „dane pliku kota między dwiema pozycjami bajtów (nie liniami) „
Torxed
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.