sed -n '10000000,10000020p' filename
Możesz być w stanie trochę to przyspieszyć:
sed -n '10000000,10000020p; 10000021q' filename
W tych poleceniach opcja -n
powoduje sed
„pomijanie automatycznego drukowania przestrzeni wzorów”. p
Polecenia „print [s] obecna przestrzeń wzór” i q
polecenie „Natychmiast zamknąć [s] z sed skryptu bez przetwórstwa więcej wejście ...” Te cytaty pochodzą ze sed
man
strony .
Nawiasem mówiąc, twoje polecenie
tail -n 10000000 filename | head 10
zaczyna się od dziesiątej milionowej linii od końca pliku, podczas gdy twoje polecenie „środkowe” wydaje się zaczynać od dziesiątej milionowej liczby od początku, co byłoby równoważne z:
head -n 10000010 filename | tail 10
Problem polega na tym, że w przypadku nieposortowanych plików o wierszach o zmiennej długości każdy proces będzie musiał przejść przez liczenie plików nowego wiersza. Nie można tego skrócić.
Jeśli jednak plik zostanie posortowany (na przykład plik dziennika ze znacznikami czasu) lub ma linie o stałej długości, możesz wyszukać plik na podstawie pozycji bajtu. W przykładzie pliku dziennika możesz wyszukiwać binarnie przedział czasu, tak jak robi to mój skrypt Python tutaj *. W przypadku pliku o stałej długości rekordu jest to naprawdę łatwe. Po prostu szukasz linelength * linecount
znaków do pliku.
* Wciąż zamierzam opublikować kolejną aktualizację tego skryptu. Może kiedyś się tym zajmę.