Chcę zlokalizować datę, która jest gdzieś w dzienniku 8 GB (tekst).
Mogę nieco bypass pełnym sekwencyjnego odczytu i najpierw zrobić binarnych podziałów pliku (rozmiaru), albo jakoś nawigacją systemu plików inodes
(co wiem bardzo niewiele o), aby rozpocząć czytanie od każdego punktu podziału, aż znajdę odpowiednie przesunięcie od od czego zacząć szukanie tekstu w wierszu dotyczącym daty?
tail
odczyt ostatniego wiersza nie używa normalnego odczytu sekwencyjnego, więc zastanawiam się, czy ta funkcja jest jakoś dostępna w bash, czy też powinienem użyć Pythona lub C / C ++ ... ale jestem szczególnie zainteresowany bash
opcją ..
bash
filesystems
text-processing
Peter.O
źródło
źródło
Odpowiedzi:
który .. nie tworzy plików podzielonych tymczasowo, pomija bloki * 512 MB danych przy każdym uruchomieniu, odczytuje 64 bajty z tej pozycji i ogranicza wynik do pierwszego wiersza z tych 64 bajtów.
możesz dostosować 64 do tego, co uważasz za potrzebne.
źródło
dd
do tego używał ... To świetne narzędzie! :)Brzmi jak chcesz:
lub dowolną liczbę bajtów, które chcesz pominąć. Znak plus informuje ogon, aby mierzył od początku pliku zamiast od końca. Jeśli używasz wersji GNU tail, możesz to napisać jako:
Aby uzyskać stałą liczbę bajtów po wycięciu, zamiast całej reszty pliku, po prostu przesuń go przez głowę:
źródło
dd
przeskakuje do określonego bajtu (jak to robitail
), ale jest to ból kodujący wokół nieznanych długości linii, a następnie wezwanie do sed, aby usunąć wiodące częściowe linie ... Wygląda na to, że głowa ogona może to zrobić bezboleśnie (tak szybko?) . Nie rozumiem, jak głowa może zakręcić kurek na ogonie, ale wydaje się, że tak :) Musi tak być: jeśli głowa przestanie otrzymywać, ogon przestanie wysyłać (i przestanie czytać dalej). Musisz wrócić ... jutro.tail
/head
nie są też w stanie ślepo odgadnąć długości linii. musisz przeskoczyć do pozycji x, a następnie możesz spojrzeć w lewo lub w prawo od x, aby zobaczyć następne\n
. nie ma znaczenia, jak nazywa się ten program. więc w obu przypadkach przeskakujesz do x, a następnie używasz,head
aby spojrzeć w prawo na następny koniec linii.tail|head
oferuje możliwość nie być zainteresowana w ogóle odd
„s count = val. W przypadku „dd”, jeśli nie zdobędę wystarczającej ilości danych, oznacza to „koniec gry”. Elastyczność dowolnych długości linii jest ogromna. Napisałem funkcję dla „dd”, która zwraca „najbliższą” pełną linię i jej przesunięcie, ale wolałbym uniknąć problemu z długością. Testowałem teraz głowę | ogona i początkowo działa ona dobrze (do przesunięcia = 100 MB), ale zwalnia znacznie, aby zająć 2 minuty na jeden dostęp przy przesunięciu = 8 GB (mogę toawk
zrobić w ciągu 1 minuty) ... więc jest świetnie za mniejsze pliki .. Dzięki za poinformowanie mnie o kombinacji ogona / głowy :)Spróbowałbym czegoś takiego, aby podzielić dziennik na fragmenty 512 MB dla szybszego parsowania.
Jeśli szukasz pliku, działałyby następujące czynności:
Użyj tego wyniku, aby określić, który plik ma być grep dla twojej daty.
źródło
Oto mój skrypt, szukam pierwszego wiersza, w którym pierwsze pole pasuje do mojego numeru. Linie są sortowane według pierwszego pola. Używam dd do sprawdzenia pierwszego wiersza bloków o wartości 128K, następnie przeskakuję do bloku i przeprowadzam wyszukiwanie. Poprawia wydajność, gdy plik przekracza 1M.
Wszelkie uwagi i poprawki są mile widziane!
* EDIT * ** grep jest znacznie szybszy i ACK nawet lepiej
źródło