W FNR..nextfileprzestaje 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
Byłem jednym z tych ludzi, którzy znaleźli to w Google. Dzięki!
Floris
dla mnie ten kod wypisał pełną ścieżkę do pliku. Właśnie tego potrzebowałem. Również FNR=1przeszuka tylko pierwszą linię. Dzięki!
Brian W
2
Aby to zrobić rekurencyjnie w katalogu:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog
1
Dzięki @OrangeDog. Jedna niewielka korekta: powinna być-type f
David Siegal
26
Lub użyj awkdo pojedynczego procesu bez |:
awk '/your_regexp/ && NR < 11' INPUTFILE
W każdym wierszu, jeśli your_regexppasuje, 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 ( -noznacza to, że nie drukuj danych wejściowych, co w przeciwnym razie jest wartością domyślną) i kończy pracę zaraz po 10. linii.
@potong masz rację, poprawione. @srikanthradix, chociaż może być szybsze, rozwiązaniem nie jest wyszukiwanie wyrażeń regularnych, ale tylko ustalonych ciągów. awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfilerobi.
Zsolt Botykai
4
Poza tym styl nie jest awkish. 2xifsa 1xelsew poleceniu, które nie wymaga działania, stwierdzenie spowodowałoby aho. weinberger i kernighan płaczą ...
jaypal singh
1
Myślę, że zamiast NR lepiej byłoby użyć FNR, ponieważ jeśli używasz awk z wieloma plikami, FNR zaczyna się od 0 dla każdego pliku.
Vladyslav Savchenko
9
Masz kilka opcji używania programów wraz z grep. Najprostszym moim zdaniem jest użycie head:
head -n10 filename | grep ...
headwyświetli pierwsze 10 wierszy (używając -nopcji), a następnie możesz potokować to wyjście grep.
Nie zdaje sobie sprawy, wszystkie rozwiązania wykorzystujące tutaj headzostały wykorzystane -n 10(w tym mnie), nie zdając sobie sprawy, że headprzez standardowe wyświetlacze zaledwie 10 wierszy . :)
Nie, to da ci pierwsze 6 wystąpień „string” w całym pliku
cov.txt
2
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ć headz 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)
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”.
Chociaż może to dobrze. dodaj więcej opisu pytania, aby odpowiedź była bardziej wyczerpująca.
Pramod S. Nikam
3
To odpowiada na zupełnie inne pytanie i nie jest przydatne w tym kontekście.
Pre101
-1
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:
head
:someCmd | head -10
head log.txt | grep <whatever>
-l
opcji grepa ? Chciałbym wymienić wszystkie pliki, które mają pierwsze 5 znakówRIFFD
.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łemW
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źródło
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|
: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
: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.źródło
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
a1xelse
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życiehead
:head
wyświetli pierwsze 10 wierszy (używając-n
opcji), a następnie możesz potokować to wyjściegrep
.źródło
head
zostały wykorzystane-n 10
(w tym mnie), nie zdając sobie sprawy, żehead
przez standardowe wyświetlacze zaledwie 10 wierszy . :)źródło
Możesz użyć następującej linii:
źródło
Wyjście programu
head -10 file
może zostać przesłane potokiemgrep
w celu osiągnięcia tego:Korzystanie z Perla:
źródło
-A 2
: wypisz dwie linie przed wzorem.-B 2
: wypisz dwie linie po wzorze.źródło
-C 2
zrobię to samo co-A 2 -B 2
To wyszukuje tylko pierwsze 6 wierszy
string
źródło
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
ztail
: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)
źródło
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”.
źródło
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:
NB: Wzorzec w moim przypadku zawsze pasuje do pierwszej linii.
źródło