Chcę wyodrębnić niektóre wiersze za pomocą 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 linii od 122 do 129?
Komentarze
Odpowiedź
Nie rozumiesz, jak działa awk
. Określony „program” jest zawsze wykonywany raz dla każdej linii (lub „rekordu” w żargonie awk) wejścia, nie ma potrzeby stosowania FOR
lub dowolnej podobnej konstrukcji. Po prostu użyj:
metoda szczegółowa
ls -l | awk "NR>=122 && NR<=129 { print }"
metoda bardziej zwarta
ls -l | awk "NR==122,NR==129"
To daje zakres dla NR
, czyli „rekordu numeru”, zazwyczaj jest to to bieżący wiersz awk
jest przetwarzany.
Komentarze
- Właściwie typowe
awk
dla takiego zadania jest zwyklels -l | awk 'NR==122,NR==129'
. - jakie jest polecenie pobrania ostatnich 100 linii z pliku przy użyciu awk
- @ShihabudheenKM Może rzucić okiem na to: stackoverflow.com/questions/12546919/…
Odpowiedź
Jeszcze jedną alternatywną metodą byłoby użycie sed
:
Ale jeśli, jak sugeruje twoje pytanie, ważne jest, aby używać do tego awk, przejdź do komentarza manatwork do odpowiedzi Zrajma. Jak podaje 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.
Więc jeśli chcesz, możesz również wprowadzić bardziej zaawansowane warunki. Na przykład:
ls -l | awk "NR==122,/foobar/"
Spowoduje to rozpoczęcie wyjścia w linii 122 i kontynuowanie aż do wiersza zawierającego słowo „foobar”.
Jeśli podasz nam rzeczywisty przypadek użycia, być może będziemy w stanie pomóc w znalezieniu lepszych rozwiązań. Martwię się, że to brzmi jak problem XY .
Odpowiedź
Inny sposób robienie tego (chociaż wolę metodę awk
) przy użyciu coreutils:
ls -l | tail -n +122 | head -n 8
Odpowiedź
awk "NR == 122,NR == 129{print $0}" file
Tutaj możemy wyodrębnić wiersze od 122 do 129 pliku.
$0
służy do drukowania całych danych pliku między 122 a 129 liniami.
Komentarze
- zduplikowana odpowiedź unix.stackexchange.com/a/89641/72456
sed
, ponieważsed
jest o wiele mniejsza (i ładuje się szybciej) niżawk
.