Jag vill extrahera några rader med awk
. Är det möjligt att utföra följande uppgift:
ls -l | awk "BEGIN FOR(i=122;i<=129;i++) FNR==i"
Hur kan jag visa detaljerna från radnummer 122 till 129?
Kommentarer
Svar
Du har inte förstått hur awk
fungerar. Det angivna ”programmet” alltid körs en gång för varje rad (eller ”post” i awk-språk) av inmatningen, det finns inget behov av FOR
eller någon liknande konstruktion. Använd bara:
verbose method
ls -l | awk "NR>=122 && NR<=129 { print }"
mer kompakt metod
ls -l | awk "NR==122,NR==129"
Den här ger ett intervall för NR
, vilket är ”Number Record”, typiskt detta är den aktuella raden awk
bearbetar.
Kommentarer
- Egentligen den typiska
awk
kod för en sådan uppgift är vanligtvisls -l | awk 'NR==122,NR==129'
. - vad är kommandot för att få de senaste 100 raderna från filen med awk
- @ShihabudheenKM Titta på det här: stackoverflow.com/questions/12546919/…
Svar
En annan alternativ metod skulle vara att använda sed
:
Men, som din fråga antyder, är det viktigt att använda awk för detta, gå med manatworks kommentar på Zrajms svar. Som awks dokumentation säger:
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å om du vill kan du också göra mer avancerade villkor. Till exempel:
ls -l | awk "NR==122,/foobar/"
Detta skulle starta utdata vid rad 122 och fortsätta tills en rad innehöll ordet ”foobar”.
Om du berättar om det faktiska användningsfallet kan vi kanske hjälpa till med svar som ger en bättre lösning. Jag är orolig för att det låter som ett XY-problem .
Svar
Ett annat sätt att gör detta (även om jag föredrar awk
-metoden) med coreutils:
ls -l | tail -n +122 | head -n 8
Svar
awk "NR == 122,NR == 129{print $0}" file
Här kan vi extrahera raderna från 122 till 129 i filen.
$0
används för att skriva ut hela fildata mellan 122 och 129 rader.
Kommentarer
- duplicerat svar av unix.stackexchange.com/a/89641/72456
sed
metod, eftersomsed
är så mycket mindre (och laddas snabbare) änawk
.