Próbuję debugować problem z serwerem, a mój jedyny plik dziennika to plik dziennika 20 GB (nawet bez znaczników czasu! Dlaczego ludzie używają System.out.println()
do logowania? W produkcji ?!)
Używając grep, znalazłem obszar pliku, który chciałbym obejrzeć, linia 347340107.
Inne niż robienie czegoś takiego
head -<$LINENUM + 10> filename | tail -20
... które wymagałyby head
odczytania pierwszych 347 milionów linii pliku dziennika, czy istnieje szybkie i łatwe polecenie, które zrzuciłoby linie 347340100 - 347340200 (na przykład) na konsolę?
aktualizacja Całkowicie zapomniałem, że grep może wydrukować kontekst wokół dopasowania ... to działa dobrze. Dzięki!
Odpowiedzi:
z GNU-grep można po prostu powiedzieć
źródło
Znalazłem dwa inne rozwiązania, jeśli znasz numer linii, ale nic więcej (nie jest możliwe grep):
Zakładając, że potrzebujesz linii od 20 do 40,
lub
źródło
41q
poinstruuj sed, aby zrezygnował z linii41
.metoda 3 wydajna w przypadku dużych plików
najszybszy sposób wyświetlania określonych linii
źródło
Nie, nie ma, pliki nie mogą być adresowane liniowo.
Nie ma żadnego sposobu na znalezienie początku linii n w pliku tekstowym. Musisz przesyłać strumieniowo plik i liczyć nowe wiersze.
Użyj najprostszego / najszybszego narzędzia, które musisz wykonać. Dla mnie używanie
head
ma o wiele większy sens niżgrep
, ponieważ to drugie jest o wiele bardziej skomplikowane. Nie mówię, że „grep
jest wolny”, tak naprawdę nie jest, ale byłbym zaskoczony, gdyby był szybszy niżhead
w tym przypadku.head
Zasadniczo byłby to błąd .źródło
Co powiesz na:
Nie przetestowałem tego, ale myślę, że to zadziała.
źródło
Wolę po prostu wejść do
less
i:43210
zrobić to samoi podobne rzeczy.
Jeszcze lepiej: naciśnij, vaby rozpocząć edycję (w vimie, oczywiście!), W tym miejscu. Teraz zauważ, że
vim
ma takie same powiązania klawiszy!źródło
Najpierw podzieliłem plik na kilka mniejszych, takich jak ten
a następnie grep na wynikowych plikach.
źródło
Możesz użyć
ex
polecenia, standardowego edytora uniksowego (teraz część Vima), npwyświetl pojedynczą linię (np. drugą linię):
odpowiednia składnia sed:
sed -n '2p' file.txt
zakres linii (np. 2-5 linii):
składnia sed:
sed -n '2,5p' file.txt
od podanej linii do końca (np. 5 do końca pliku):
składnia sed:
sed -n '2,$p' file.txt
wiele zakresów linii (np. 2-4 i 6-8 linii):
składnia sed:
sed -n '2,4p;6,8p' file.txt
Powyższe polecenia można przetestować za pomocą następującego pliku testowego:
Wyjaśnienie:
+
lub-c
po komendzie - wykonaj komendę (vi / vim) po odczytaniu pliku,-s
- tryb cichy, używa również terminala jako domyślnego wyjścia,q
po nim-c
następuje polecenie wyjścia z edytora (dodaj,!
aby wymusić zamknięcie, np-scq!
.).źródło
Jeśli twój numer linii to 100 do odczytania
źródło
Dostać
ack
Instalacja Ubuntu / Debian:
Następnie uruchomić:
Przykład:
Od
$ man ack
:źródło
--lines
Parametr został usunięty.sed również będzie musiał odczytać dane, aby policzyć linie. Jedynym sposobem, w jaki skrót byłby możliwy, byłby kontekst / kolejność w pliku do działania. Na przykład, jeśli były poprzedzone wiersze dziennika o stałej szerokości daty / godziny itp., Można użyć narzędzia look unix do binarnego przeszukiwania plików dla określonych dat / godzin
źródło
Posługiwać się
Tutaj otrzymasz numer linii, w której miało miejsce dopasowanie.
Teraz możesz użyć następującego polecenia, aby wydrukować 100 linii
lub możesz również użyć „sed”
źródło
Ze
sed -e '1,N d; M q'
będziesz drukować linie N + 1 przez M. Jest to prawdopodobnie nieco lepiej wtedygrep -C
jak nie spróbować dopasować linie wzoru.źródło
-e
jest tutaj opcjonalny.Opierając się na odpowiedzi Sklivvza, oto fajna funkcja, którą można umieścić w
.bash_aliases
pliku. Jest skuteczny w przypadku dużych plików podczas drukowania rzeczy z przodu pliku.źródło
Aby wyświetlić wiersz od
<textfile>
jego<line#>
, po prostu wykonaj następujące czynności:Jeśli chcesz mocniejszego sposobu wyświetlania zakresu wierszy za pomocą wyrażeń regularnych - nie powiem, dlaczego grep jest złym pomysłem na zrobienie tego, powinno być dość oczywiste - to proste wyrażenie pokaże twój zakres w pojedynczy przebieg, który jest tym, czego chcesz, gdy masz do czynienia z plikami tekstowymi ~ 20 GB:
(wskazówka: jeśli zawiera
/
w sobie wyrażenie regularne , użyj czegoś takiego jakm!<regex>!
)Zostanie wydrukowane,
<filename>
zaczynając od pasującej linii,<regex1>
aż do linii (i włącznie) pasującej linii<regex2>
.Czarodziej nie musi zobaczyć, jak kilka poprawek może uczynić go jeszcze bardziej wydajnym.
Ostatnia rzecz: perl, ponieważ jest to dojrzały język, ma wiele ukrytych ulepszeń, które sprzyjają szybkości i wydajności. Mając to na uwadze, jest to oczywisty wybór dla takiej operacji, ponieważ pierwotnie została opracowana do obsługi dużych plików dziennika, tekstu, baz danych itp.
źródło
Możesz spróbować tego polecenia:
źródło
Łatwo z perlem! Jeśli chcesz pobrać wiersz 1, 3 i 5 z pliku, powiedz / etc / passwd:
źródło
Dziwię się, że tylko jedna inna odpowiedź (autorstwa Ramany Reddy) zasugerowała dodanie numerów wierszy do wyniku. Poniżej szuka wymaganego numeru linii i koloruje wydruk.
źródło