Mam bardzo długie pliki dziennika, czy można poprosić grepa o przeszukanie tylko pierwszych 10 wierszy?
Mam bardzo długie pliki dziennika, czy można poprosić grepa o przeszukanie tylko pierwszych 10 wierszy?
Odpowiedzi:
Magia rur;
head -10 log.txt | grep <whatever>
head log.txt | grep <whatever>
-l
opcji grepa ? Chciałbym wymienić wszystkie pliki, które mają pierwsze 5 znaków RIFFD
.
Ludzie, którzy znaleźli to w Google, musieli przeszukać pierwsze n
wiersze wielu plików, ale wydrukować tylko pasujące nazwy plików. użyłem
gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames
W FNR..nextfile
przestaje przetwarzać plik raz 10 linii zostały zaobserwowane. Wyświetla //..{}
nazwę pliku i przechodzi dalej, gdy pojawi się pierwsze dopasowanie w danym pliku. Aby cytować nazwy plików dla innych programów, użyj
gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
FNR=1
przeszuka tylko pierwszą linię. Dzięki!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
Lub użyj awk
do pojedynczego procesu bez |
:
awk '/your_regexp/ && NR < 11' INPUTFILE
W każdym wierszu, jeśli your_regexp
pasuje, a liczba rekordów (wierszy) jest mniejsza niż 11, wykonuje domyślną akcję (czyli drukowanie wiersza wejściowego).
Lub użyj sed
:
sed -n '/your_regexp/p;10q' INPUTFILE
Sprawdza twoje wyrażenie regularne i wypisuje wiersz ( -n
oznacza to, że nie drukuj danych wejściowych, co w przeciwnym razie jest wartością domyślną) i kończy pracę zaraz po 10. linii.
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile
-- szybciej.
awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile
robi.
awkish
. 2xifs
a 1xelse
w poleceniu, które nie wymaga działania, stwierdzenie spowodowałoby aho. weinberger i kernighan płaczą ...
Masz kilka opcji używania programów wraz z grep
. Najprostszym moim zdaniem jest użycie head
:
head -n10 filename | grep ...
head
wyświetli pierwsze 10 wierszy (używając -n
opcji), a następnie możesz potokować to wyjście grep
.
head
zostały wykorzystane -n 10
(w tym mnie), nie zdając sobie sprawy, że head
przez standardowe wyświetlacze zaledwie 10 wierszy . :)
grep "pattern" <(head -n 10 filename)
Możesz użyć następującej linii:
head -n 10 /path/to/file | grep [...]
Wyjście programu head -10 file
może zostać przesłane potokiem grep
w celu osiągnięcia tego:
head -10 file | grep …
Korzystanie z Perla:
perl -ne 'last if $. > 10; print if /pattern/' file
head -10 log.txt | grep -A 2 -B 2 pattern_to_search
-A 2
: wypisz dwie linie przed wzorem.
-B 2
: wypisz dwie linie po wzorze.
head -10 log.txt # read the first 10 lines of the file.
-C 2
zrobię to samo co-A 2 -B 2
grep -m6 "string" cov.txt
To wyszukuje tylko pierwsze 6 wierszy string
Rozszerzenie do odpowiedzi Joachima Isakssona: Dość często potrzebuję czegoś ze środka długiego pliku, np. Wiersze od 5001 do 5020, w takim przypadku można łączyć head
z tail
:
head -5020 file.txt | tail -20 | grep x
Spowoduje to pobranie pierwszych 5020 linii, a następnie wyświetlenie tylko ostatnich 20 z nich, a następnie potokuje wszystko do grep.
(Edytowano: błąd słupka ogrodzeniowego w moich przykładowych liczbach, dodano potok do grepa)
grep -A 10 <Wzór>
Ma to na celu pobranie wzoru i 10 następnych wierszy za wzorem. To działałoby dobrze tylko dla znanego wzorca, jeśli nie masz znanego wzorca, użyj sugestii „głowy”.
Miałem podobny problem i cały powyższy problem nie rozwiązuje go całkowicie. Interesuje mnie również uzyskanie nazwy pliku zawierającej pasujące wiersze. Moje rozwiązanie:
ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'
NB: Wzorzec w moim przypadku zawsze pasuje do pierwszej linii.
head
:someCmd | head -10