Chyba każdy zna przydatne narzędzia Linuksa do cmd head
i tail
. head
pozwala wydrukować pierwsze X wierszy pliku, tail
robi to samo, ale drukuje koniec pliku. Jakie jest dobre polecenie, aby wydrukować środek pliku? coś w stylu middle --start 10000000 --count 20
(wydrukuj 10 000 000 do 10 000 000 linii).
Szukam czegoś, co skutecznie poradzi sobie z dużymi plikami. Próbowałem tail -n 10000000 | head 10
i to jest strasznie wolne.
Odpowiedzi:
Możesz być w stanie trochę to przyspieszyć:
W tych poleceniach opcja
-n
powodujesed
„pomijanie automatycznego drukowania przestrzeni wzorów”.p
Polecenia „print [s] obecna przestrzeń wzór” iq
polecenie „Natychmiast zamknąć [s] z sed skryptu bez przetwórstwa więcej wejście ...” Te cytaty pochodzą zesed
man
strony .Nawiasem mówiąc, twoje polecenie
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:
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ę.
źródło
sed
wersja Karolamiddle
funkcji:middle() { local s=$1 c=$2; shift 2; sed -n "$s,$(($s + $c -1))p; $(($s + $c))q" "$@"; }
. Będzie obsługiwał wiele argumentów plików, nazwy plików ze spacjami itp. Wiele plików jest przetwarzanych razem, tak jakby były one przechwytywane w taki sam sposób, jaksed
zwykle (tak więc środkowy 1000 100 plik1 plik2 rozciągałby się od końca pierwszego pliku do początku drugiego, jeśli pierwszy ma mniej niż 1100 linii).middle startline count filename
lub wieloma nazwami plików:middle startline count file1 file2 file3
lub z przekierowaniem:middle startline count < filename
lub w potoku:some_command |
środkowa liczba linii startowych lubcat file* | middle startline count
Dowiedziałem się o następującym zastosowaniu
sed
Mam nadzieję, że komuś się przyda!
źródło
sed -n
argument, co czyni ją dość czytelną.extract_lines(){sed -n "$1,+$2p" <file>}
które zapisuje na standardowe wyjście.To mój pierwszy post tutaj! W każdym razie ten jest łatwy. Powiedzmy, że chcesz pobrać linię 8872 z pliku o nazwie file.txt. Oto jak to zrobić:
cat -n plik.txt | grep „^ * 8872”
Teraz pytanie brzmi: po 20 wierszach. Aby to osiągnąć, robisz
cat -n plik.txt | grep -A 20 '^ * 8872'
Dla linii wokół lub przedtem zobacz flagi -B i -C w instrukcji grep.
źródło
cat -n file.txt | grep '^ *1'
wydaj wszystkie linie, które mają 1 po prawej stronie. Jak wydrukować wiersz 1 za pomocą tej techniki? Wiem, że mogę skierować -n 1 .... ale jak używać grep?Sedn odpowiedź Dennisa jest właściwą drogą. Ale używając tylko głowy i ogona, pod uderzeniem:
To skanuje dwa pierwsze wiersze 1 $ + 2 $, więc jest znacznie gorsze niż odpowiedź Dennisa. Ale nie musisz pamiętać tych wszystkich liter, aby z niego skorzystać ....
źródło
$[...]
jest przestarzałe, przynajmniej w Bash. Ponadto brakuje parametru pliku.middle 10 10 < /var/log/auth.log
.Użyj następującego polecenia, aby uzyskać określony zakres linii
Tutaj debug.log to mój plik, który składa się z braków linii i użyłem do wydrukowania linii z numeru linii 1220974 do 1513793 do pliku test.log. mam nadzieję, że będzie to pomocne w przechwytywaniu zakresu linii.
źródło
Rubinowa wersja oneliner.
Może być komuś przydatny. Rozwiązania z „sed” dostarczone przez Dennisa i Dox są bardzo fajne, nawet jeśli wydają się szybsze.
źródło
Możesz użyć „nl”.
źródło
Na przykład ten awk wydrukuje linie od 20 do 40
źródło
Jeśli znasz numery linii, powiedz, że chcesz pobrać linie 1, 3 i 5 z pliku, powiedz / etc / passwd:
źródło
Perl jest królem:
źródło