Grep w ogromnym pliku dziennika (> 14 GB) tylko ostatnie x GB?


34

Muszę przeszukać coś w ogromnym pliku dziennika (ponad 14 GB). Jestem prawie pewien, że to ostatnie 4 GB.

Czy istnieje sposób na pominięcie pierwszego X GB, aby przyspieszyć?


7
LC_ALL=C grepmoże to przyspieszyć.
— jfs

1
Będziesz mógł uzyskać dużą prędkość, wybierając rozsądne grepwyrażenie ... symbole wieloznaczne o nieznanej długości (np. a.*thing) W niektórych przypadkach będą trwać znacznie dłużej. Może się zdarzyć, że optymalizujesz pod kątem niewłaściwej rzeczy (chociaż wyszukiwanie części tylko pliku nigdy nie boli, oczywiście - może to nie być największe źródło przyspieszenia).
— Floris,

Odpowiedzi:


75

Wydaje mi się, że można użyć ogona tylko do wyjścia o pojemności około 4 GB za pomocą -cprzełącznika

-c, --bytes = [+] NUM wypisuje
ostatnie NUM bajtów; lub użyj -c + NUM, aby wypisać zaczynając od bajtu NUM każdego pliku

Prawdopodobnie możesz coś zrobić również z dd , ustawiając bs=1i skipustawiając przesunięcie, które chcesz zacząć np

dd if=file bs=1024k skip=12g | grep something

83
Następnie powinieneś skonfigurować logrotate.
— Gerald Schneider,

3
@Rogier Dodaj odpowiedź z rozwiązaniem zamiast dodawać ją w swoim pytaniu. Jest to podobne do odpowiedzi własnej: serverfault.com/help/self-answer
— AL

5
@istheEnglishway: Cóż, nie, opublikowali inne polecenie.
— Lekkość ściga się z Moniką

11
Ale twoja odpowiedź nie zawiera rzeczywistego polecenia implementującego to rozwiązanie, które stanowi wartość dodaną. Możesz edytować to w swojej odpowiedzi lub OP może opublikować jako nową odpowiedź. Zdecydowanie nie powinni dodawać tego do pytania, co się stało. I zdecydowanie nie powinieneś rzucać się po epitetach takich jak „szturchanie nosem”.
— Lekkość ściga się z Moniką

7
@istheEnglishway, wierzcie lub nie mając przykładu, czynią rzeczy łatwiejszymi niż czytanie strony
— podręcznika

32

Po prostu to publikuję, ponieważ niektóre komentarze o to poprosiły.

To, czego ostatecznie użyłem, to (plik 15 GB). Działało bardzo szybko i oszczędzało mi mnóstwo czasu.

tail -f -c 14G file | grep something

Zrobiłem również bardzo podstawowy test porównawczy dla tego samego pliku. Testowałem:

plik grep xxx
// trwał wiecznie (> 5 minut)

dd if = plik bs = 1 pomiń = 14G | grep xxx
// bardzo szybko <1 sek

ogon-c 14g | grep xxx
// dość szybko <2 sek

tailjest tylko nieco krótszy.

Uwaga: sufiks stosowane gi Gróżnić w zależności od polecenia (Ubuntu 15.10)


Czy wyczyściłeś pamięć podręczną dysku między testami porównawczymi? Podejrzewam, że większość czasu w pierwszym była we / wy. Przyspieszenie powinno być rzędu 15 ×, a nie 300 ×.
— Reid

2
@Reid nie zrobiłem. Ale uruchomiłem każde polecenie wiele razy. Jestem całkiem pewien, że dd lub tail znacznie przyspieszą prędkość po prostu grep (pamięć podręczna lub nie).
— Roger,

19

To nie odpowiada na pytanie tytułowe, ale zrobi to, co chcesz. Użyj tac, aby odwrócić plik, a następnie użyj grep, aby znaleźć swój ciąg. Jeśli ciąg znaków występuje w pliku tylko raz lub znaną liczbę razy, pozwól mu działać, dopóki nie znajdzie znanej liczby wystąpień. W ten sposób, jeśli twoje założenie dotyczące tego, gdzie jest w pliku, jest nieprawidłowe, nadal je znajdzie. Jeśli chcesz to ograniczyć, możesz użyć do tego głowy. Komenda główna będzie przechodzić między tac a grep.

Polecenie wygląda więc tak:

tac < logfile | grep myString

1
Przyszedłem tutaj, aby napisać dokładnie tę samą odpowiedź. Dziwię się, że nikt nie ocenił twojego.
— Dmitrij Grigoriew

2
Zajęło mi to chwilę, ale potem jęknąłem na kalambur ... tac jest przeciwieństwem kota.
— Sammi

1
Musiałem przekopać się w dzienniku aplikacji / debugowania . Ponieważ odwraca wiersze, jego czytanie nie jest łatwiejsze ;-) Wydaje się jednak bardzo szybkie. Nigdy nie widziałem tac, więc dzięki!
— Roger,
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.