Hallo,
Ik ben mijn eerste stapjes in gawk aan het nemen. Ik denk dat ik al behoorlijk door heb wat er allemaal mogelijk is met gawk, maar 1 iets triviaals lukt me nog niet, namelijk een stukje uit een bepaalde lijn halen.
Bv.: met sed:
Dit doet bv. het volgende:
Met gawk ben ik hier nog niet in geslaagd.
Ik ben op de hoogte van de sub() en gsub() methodes in gawk, maar ik zie niet meteen hoe ik deze effectief kan gebruiken? Het voornaamste probleem is dat ik binnen deze methodes blijkbaar geen backreferences kan gebruiken blijkbaar?
Het volgende werkt bv. niet:
Hoe doe ik het equivalent van bovenstaande sed expressie met gawk?
Bij uitbreiding: ik heb een lijst in het volgende formaat:
(Apache logs in mijn geval.)
Zowel gawk als cut gaan de input op dezelfde manier onderverdelen: door gewoon 1 karakter als delimiter te gaan gebruiken. Er wordt echter geen rekening gehouden met de quotes, dus spaties binnen de quotes worden ook als delimiters aanzien, en veld3 en veld5 worden dan ook onderverdeeld in verschillende velden. Deze input is dan ook niet eenvoudig te parsen...
Is het mogelijk om deze input iets intelligenter te gaan parsen (evt. dmv. gawk) zodat veld3 en veld5 in hun geheel incl. spaties als 1 veld worden aanzien? Hoe kan dit het makkelijkst eenvoudig gebeuren?
Ik ben mijn eerste stapjes in gawk aan het nemen. Ik denk dat ik al behoorlijk door heb wat er allemaal mogelijk is met gawk, maar 1 iets triviaals lukt me nog niet, namelijk een stukje uit een bepaalde lijn halen.
Bv.: met sed:
code:
(waarbij iets dan meestal ook een regex is)1
| sed -e 's/.*\(iets\).*/\1/g' |
Dit doet bv. het volgende:
code:
1
2
| $ echo een twee drie | sed -e 's/.*\(twee\).*/\1/g' twee |
Met gawk ben ik hier nog niet in geslaagd.
Ik ben op de hoogte van de sub() en gsub() methodes in gawk, maar ik zie niet meteen hoe ik deze effectief kan gebruiken? Het voornaamste probleem is dat ik binnen deze methodes blijkbaar geen backreferences kan gebruiken blijkbaar?
Het volgende werkt bv. niet:
code:
1
2
3
4
5
6
| gawk '{ print /iets/ }' // Dit print enkel 1. gawk '{ gsub(^.*\(iets\).*$, "\1") }' // Geen idee hoe backreferences mogelijk zijn met gawk? // Is het mogelijk om het gematchte gedeelte van een regex in een variabele te stoppen? |
Hoe doe ik het equivalent van bovenstaande sed expressie met gawk?
Bij uitbreiding: ik heb een lijst in het volgende formaat:
code:
1
2
3
4
| veld1 veld2 "dit is veld 3" veld4 "veld 5 ook met spaties" veld1 veld2 "dit is veld 3" veld4 "veld 5 ook met spaties" veld1 veld2 "dit is veld 3" veld4 "veld 5 ook met spaties" ... |
(Apache logs in mijn geval.)
Zowel gawk als cut gaan de input op dezelfde manier onderverdelen: door gewoon 1 karakter als delimiter te gaan gebruiken. Er wordt echter geen rekening gehouden met de quotes, dus spaties binnen de quotes worden ook als delimiters aanzien, en veld3 en veld5 worden dan ook onderverdeeld in verschillende velden. Deze input is dan ook niet eenvoudig te parsen...
Is het mogelijk om deze input iets intelligenter te gaan parsen (evt. dmv. gawk) zodat veld3 en veld5 in hun geheel incl. spaties als 1 veld worden aanzien? Hoe kan dit het makkelijkst eenvoudig gebeuren?