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?
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?
Odpowiedzi:
Nie zrozumiałeś, jak to awk
działa. Określony „program” jest zawsze wykonywany raz dla każdej linii (lub „rekordu” w języku awk) wejścia, nie ma potrzeby FOR
ani 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 awk
przetwarzana.
awk
kod takiego zadania jest zwykle ls -l | awk 'NR==122,NR==129'
.
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 .
sed
metodę, ponieważsed
jest o wiele mniejsza (i ładuje się szybciej) niżawk
.