Jak uruchomić awk dla pewnej liczby linii.?

18

Chcę wyodrębnić niektóre wiersze awk. Czy można wykonać następujące zadanie:

ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'

Jak mogę wyświetlić szczegóły z numerów od 122 do 129?

cooldharma06
źródło
Jeśli miałbyś to zrobić w pętli, zasugerowałbym sedmetodę, ponieważ sedjest o wiele mniejsza (i ładuje się szybciej) niż awk.
zrajm

Odpowiedzi:

36

Nie zrozumiałeś, jak to awkdziała. Określony „program” jest zawsze wykonywany raz dla każdej linii (lub „rekordu” w języku awk) wejścia, nie ma potrzeby FORani podobnej konstrukcji. Po prostu użyj:

pełna metoda

ls -l | awk 'NR>=122 && NR<=129 { print }'

bardziej zwarta metoda

ls -l | awk 'NR==122,NR==129'

Podaje się zakres NR, który jest „rekordem liczby”, zwykle jest to bieżąca linia awkprzetwarzana.

zrajm
źródło
6
W rzeczywistości typowy awkkod takiego zadania jest zwykle ls -l | awk 'NR==122,NR==129'.
manatwork
what is the command for get last 100 line from the file using awk
Shihabudheen K M
8

Jeszcze jedną alternatywną metodą byłoby użycie sed:

ls -l | sed -ne '122,129p'

Ale jeśli, jak sugeruje twoje pytanie, ważne jest, aby użyć do tego awk, idź z komentarzem manatwork do odpowiedzi Zrajma. Jak stwierdza dokumentacja awk:

   A  pattern  may  consist  of two patterns separated by a comma; in this
   case, the action is performed for all lines from an occurrence  of  the
   first pattern though an occurrence of the second.

Jeśli chcesz, możesz także tworzyć bardziej zaawansowane warunki. Na przykład:

ls -l | awk 'NR==122,/foobar/'

Rozpocznie się to w linii 122 i będzie kontynuowane, dopóki linia nie będzie zawierała słowa „foobar”.

Jeśli podasz nam rzeczywisty przypadek użycia, możemy być w stanie pomóc z odpowiedziami, które stanowią lepsze rozwiązanie. Martwię się, że to brzmi jak problem XY .

ghoti
źródło
2

Innym sposobem na zrobienie tego (choć wolę tę awkmetodę) przy użyciu coreutils:

ls -l | tail -n +122 | head -n 8
terdon
źródło