Jeg vil udtrække nogle linjer med awk
. Er det muligt at udføre følgende opgave:
ls -l | awk "BEGIN FOR(i=122;i<=129;i++) FNR==i"
Hvordan kan jeg vise detaljerne fra linjenumre 122 til 129?
Kommentarer
Svar
Du har ikke forstået, hvordan awk
fungerer. Det angivne “program” udføres altid en gang for hver linje (eller “post” i awk parlance) af input, der er ikke behov for FOR
eller enhver lignende konstruktion. Brug bare:
verbose method
ls -l | awk "NR>=122 && NR<=129 { print }"
mere kompakt metode
ls -l | awk "NR==122,NR==129"
Denne giver et interval for NR
, som er “Number Record”, typisk dette er den aktuelle linje awk
behandler.
Kommentarer
- Faktisk den typiske
awk
kode til en sådan opgave er normaltls -l | awk 'NR==122,NR==129'
. - hvad er kommandoen for at få sidste 100 linje fra filen ved hjælp af awk
- @ShihabudheenKM Kan se på dette: stackoverflow.com/questions/12546919/…
Svar
En anden alternativ metode ville være at bruge sed
:
Men hvis det, som dit spørgsmål antyder, er det vigtigt at bruge awk til dette, gå med manatworks kommentar til Zrajms svar. Som awk “s dokumentation siger:
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.
Så hvis du vil, kan du også gøre mere avancerede betingelser. For eksempel:
ls -l | awk "NR==122,/foobar/"
Dette starter output ved linje 122 og fortsætter indtil en linje indeholdt ordet “foobar”.
Hvis du fortæller os den aktuelle brugssag, kan vi muligvis hjælpe med svar, der giver en bedre løsning. Jeg er bange for, at det lyder som et XY-problem .
Svar
En anden måde at gør dette (selvom jeg foretrækker awk
-metoden) ved hjælp af coreutils:
ls -l | tail -n +122 | head -n 8
Svar
awk "NR == 122,NR == 129{print $0}" file
Her kan vi udtrække linjerne fra 122 til 129 i filen.
$0
bruges til at udskrive hele fildata mellem 122 og 129 linjer.
Kommentarer
- duplikeret svar fra unix.stackexchange.com/a/89641/72456
sed
metode, dased
er så meget mindre (og indlæses hurtigere) endawk
.