Ik wil enkele regels extraheren met awk
. Is het mogelijk om de volgende taak uit te voeren:
ls -l | awk "BEGIN FOR(i=122;i<=129;i++) FNR==i"
Hoe kan ik de details van regelnummers 122 tot 129 weergeven?
Opmerkingen
Answer
Je hebt niet begrepen hoe awk
werkt. Het opgegeven “programma” wordt altijd één keer uitgevoerd voor elke regel (of “record” in awk-taalgebruik) invoer, FOR
is niet nodig of een vergelijkbare constructie. Gebruik gewoon:
uitgebreide methode
ls -l | awk "NR>=122 && NR<=129 { print }"
compactere methode
ls -l | awk "NR==122,NR==129"
Deze geeft een bereik voor NR
, wat de “Number Record” is, meestal dit is de huidige regel die awk
aan het verwerken is.
Reacties
- Eigenlijk de typische
awk
code voor zon taak is meestalls -l | awk 'NR==122,NR==129'
. - wat is het commando om de laatste 100 regels uit het bestand te halen met awk
- @ShihabudheenKM Bekijk dit misschien eens: stackoverflow.com/questions/12546919/…
Answer
Een andere alternatieve methode zou zijn om sed
te gebruiken :
Maar als, zoals je vraag suggereert, het belangrijk is om awk hiervoor te gebruiken, ga dan met de opmerking van manatwork over het antwoord van Zrajm. Zoals in de awk-documentatie staat:
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.
Dus als je wilt, kun je ook meer geavanceerde voorwaarden maken. Bijvoorbeeld:
ls -l | awk "NR==122,/foobar/"
Dit zou de uitvoer beginnen op regel 122, en doorgaan tot een regel de woord “foobar”.
Als u ons de daadwerkelijke use case vertelt, kunnen we u misschien helpen met antwoorden die een betere oplossing bieden. Ik ben bang dat dit klinkt als een XY-probleem .
Antwoord
Een andere manier om dit te doen (hoewel ik de voorkeur geef aan de awk
-methode) met coreutils:
ls -l | tail -n +122 | head -n 8
Antwoord
awk "NR == 122,NR == 129{print $0}" file
Hier kunnen we de regels extraheren van 122 tot 129 van het bestand.
$0
wordt gebruikt om de volledige bestandsgegevens tussen 122 en 129 regels af te drukken.
Reacties
- gedupliceerd antwoord van unix.stackexchange.com/a/89641/72456
sed
methode, aangeziensed
zoveel kleiner is (en sneller laadt) danawk
.