|
| Dynamisk regex i awk Fra : Søren Hansen |
Dato : 04-12-00 14:57 |
|
Er der ikke en venlig sjæl, der kan forklare mig, hvordan man laver dynamisk
regex i awk?
Problemet er, at jeg har et fscking langt regex, jeg skal bruge flere steder
i samme awk-script. Hvorledes gør jeg lettest det?
Jeg sidder med O'Reilly-bogen om sed og awk, og der er beskrevet, at man kan
lave sådan et stunt, hvis det regex, man skal bruge er lavet som en
environment variabel, men derudover er jeg altså tabt.
Hvis det kan hjælpe nogen på vej, så ser det sådan her ud i bogen:
$ cat awkro2
#!/bin/sh
# assign shell's $1 to awk search variable
search=$1
awk '$1 ~ /'"$search"'/' acronyms
Det, der sker er, at ens shell expander variablen, som awk så bruger.. Kan
man ikke lave noget lignende i ren awk?
====================================================================
Søren Hansen
Systemadministrator
Mindpass.com, Vardevej 1, DK-9220 Aalborg
Reception: +45 9635 2000, GSM: +45 2828 7542, fax: +45 9635 2099
sha@mindpass.com
| |
Flemming Kjaer Jense~ (04-12-2000)
| Kommentar Fra : Flemming Kjaer Jense~ |
Dato : 04-12-00 15:53 |
|
>>>>> "Søren" == Søren Hansen <sha@mindpass.com> writes:
Søren> Er der ikke en venlig sjæl, der kan forklare mig, hvordan man
Søren> laver dynamisk regex i awk? Problemet er, at jeg har et
Søren> fscking langt regex, jeg skal bruge flere steder i samme
Søren> awk-script. Hvorledes gør jeg lettest det? Jeg sidder med
Søren> O'Reilly-bogen om sed og awk, og der er beskrevet, at man kan
Søren> lave sådan et stunt, hvis det regex, man skal bruge er lavet
Søren> som en environment variabel, men derudover er jeg altså tabt.
Søren> Hvis det kan hjælpe nogen på vej, så ser det sådan her ud i
Søren> bogen:
Søren> $ cat awkro2 #!/bin/sh # assign shell's $1 to awk search
Søren> variable search=$1 awk '$1 ~ /'"$search"'/' acronyms
Søren> Det, der sker er, at ens shell expander variablen, som awk så
Søren> bruger.. Kan man ikke lave noget lignende i ren awk?
Proev perl eller python for så undgår du sed + awk. Awk kan bruges
uden sed, mens det er (for en del) sjældent at awk bruges enkelt
stående. Prøv at kigge i oreillys sed + awk.
mvh Flemming
| |
Søren Hansen (04-12-2000)
| Kommentar Fra : Søren Hansen |
Dato : 04-12-00 16:21 |
|
"Flemming Kjaer Jensen" <fkj@kom.auc.dk> wrote in message
news:4x2sno444ra.fsf@lada.kom.auc.dk...
> >>>>> "Søren" == Søren Hansen <sha@mindpass.com> writes:
>
> Søren> Er der ikke en venlig sjæl, der kan forklare mig, hvordan man
> Søren> laver dynamisk regex i awk? Problemet er, at jeg har et
> Søren> fscking langt regex, jeg skal bruge flere steder i samme
> Søren> awk-script. Hvorledes gør jeg lettest det?
> Proev perl eller python for så undgår du sed + awk.
Hvordan kan det være et mål i sig selv at undgå sed og awk? Man kan være ret
meget mere sikker på at have sed og awk til rådighed end perl og python.
Desuden har jeg sat mig i hovedet, at nu vil jeg have for vildt meget styr
på det her awk- og sed-gejl, så det her er en oplagt mulighed. Desuden har
jeg luret det: Hvis nu jeg laver awk-scriptet, hvor jeg så skifter det
regex, jeg skal bruge ud med et eller andet navn, kører awk-scriptet igennem
sed, der erstatter navnet med det egentlige regex, og lader awk udføre
resultatet af dette, så er det fedt.
====================================================================
Søren Hansen
Systems Administrator
Mindpass.com, Vardevej 1, DK-9220 Aalborg
Reception: +45 9635 2000, GSM: +45 2828 7542, fax: +45 9635 2099
sha@mindpass.com
| |
Torben Simonsen (04-12-2000)
| Kommentar Fra : Torben Simonsen |
Dato : 04-12-00 16:42 |
|
"Søren Hansen" <sha@mindpass.com> writes:
> Hvordan kan det være et mål i sig selv at undgå sed og awk? Man kan være
> ret meget mere sikker på at have sed og awk til rådighed end perl og
> python.
På en måde forstår jeg godt din indvending. Når man spørger "Hvordan laver
jeg dittendatten i sproget X?", så er det selvfølgelig irriterende at få
svaret "Du skulle meget hellere lave det i sproget Y".
På den anden side, så kan man vel være ret sikker på at finde perl på
næsten enhver *nix-box med respekt for sig selv nu om dage? Og mange ting
*er* altså en helt del nemmere i perl end i en eller anden kringlet
sed/awk-kombination. Jeg synes faktisk, at sed/awk i nogen grad er
outdated.
> Desuden har jeg sat mig i hovedet, at nu vil jeg have for vildt meget
> styr på det her awk- og sed-gejl, så det her er en oplagt mulighed.
Den indstilling er skam også al ære værd. Jeg kunne også sagtens selv
være stædig nok til at vælge en halv-besværlig løsning, hvis jeg mener
at kunne lære noget af det.
> Desuden har jeg luret det: Hvis nu jeg laver awk-scriptet, hvor jeg så
> skifter det regex, jeg skal bruge ud med et eller andet navn, kører
> awk-scriptet igennem sed, der erstatter navnet med det egentlige regex,
> og lader awk udføre resultatet af dette, så er det fedt.
Det lyder som en af den slags ting, hvor man ikke engang selv kan finde
hoved og hale i koden, hvis man skal læse den 14 dage efter, at man har
skrevet den. Du vil kunne lave det langt mere effektivt i perl, og hvis
du skriver det i pæn og læselig perl-kode, så er der også en chance for,
at du selv kan finde ud af, hvad du har lavet bagefter.
--
-- Torben.
| |
Søren Hansen (05-12-2000)
| Kommentar Fra : Søren Hansen |
Dato : 05-12-00 09:16 |
|
"Torben Simonsen" <ts@biograferne.dk> wrote in message
news:m3lmtwfb1n.fsf@pc115235.stofanet.dk...
> "Søren Hansen" <sha@mindpass.com> writes:
>
> > Hvordan kan det være et mål i sig selv at undgå sed og awk? Man kan være
> > ret meget mere sikker på at have sed og awk til rådighed end perl og
> > python.
>
> På en måde forstår jeg godt din indvending. Når man spørger "Hvordan laver
> jeg dittendatten i sproget X?", så er det selvfølgelig irriterende at få
> svaret "Du skulle meget hellere lave det i sproget Y".
>
> På den anden side, så kan man vel være ret sikker på at finde perl på
> næsten enhver *nix-box med respekt for sig selv nu om dage? Og mange ting
> *er* altså en helt del nemmere i perl end i en eller anden kringlet
> sed/awk-kombination. Jeg synes faktisk, at sed/awk i nogen grad er
> outdated.
>
> > Desuden har jeg sat mig i hovedet, at nu vil jeg have for vildt meget
> > styr på det her awk- og sed-gejl, så det her er en oplagt mulighed.
>
> Den indstilling er skam også al ære værd. Jeg kunne også sagtens selv
> være stædig nok til at vælge en halv-besværlig løsning, hvis jeg mener
> at kunne lære noget af det.
>
> > Desuden har jeg luret det: Hvis nu jeg laver awk-scriptet, hvor jeg så
> > skifter det regex, jeg skal bruge ud med et eller andet navn, kører
> > awk-scriptet igennem sed, der erstatter navnet med det egentlige regex,
> > og lader awk udføre resultatet af dette, så er det fedt.
>
> Det lyder som en af den slags ting, hvor man ikke engang selv kan finde
> hoved og hale i koden, hvis man skal læse den 14 dage efter, at man har
> skrevet den.
Tværtimod. Hvis jeg tager det her regex, der fylder 3 linier, og indsatte
det 5 gange i
Du vil kunne lave det langt mere effektivt i perl, og hvis
> du skriver det i pæn og læselig perl-kode, så er der også en chance for,
> at du selv kan finde ud af, hvad du har lavet bagefter.
>
> --
> -- Torben.
| |
Søren Hansen (05-12-2000)
| Kommentar Fra : Søren Hansen |
Dato : 05-12-00 09:17 |
|
"Torben Simonsen" <ts@biograferne.dk> wrote in message
news:m3lmtwfb1n.fsf@pc115235.stofanet.dk...
> "Søren Hansen" <sha@mindpass.com> writes:
>
> > Hvordan kan det være et mål i sig selv at undgå sed og awk? Man kan være
> > ret meget mere sikker på at have sed og awk til rådighed end perl og
> > python.
>
> På en måde forstår jeg godt din indvending. Når man spørger "Hvordan laver
> jeg dittendatten i sproget X?", så er det selvfølgelig irriterende at få
> svaret "Du skulle meget hellere lave det i sproget Y".
>
> På den anden side, så kan man vel være ret sikker på at finde perl på
> næsten enhver *nix-box med respekt for sig selv nu om dage? Og mange ting
> *er* altså en helt del nemmere i perl end i en eller anden kringlet
> sed/awk-kombination. Jeg synes faktisk, at sed/awk i nogen grad er
> outdated.
>
> > Desuden har jeg sat mig i hovedet, at nu vil jeg have for vildt meget
> > styr på det her awk- og sed-gejl, så det her er en oplagt mulighed.
>
> Den indstilling er skam også al ære værd. Jeg kunne også sagtens selv
> være stædig nok til at vælge en halv-besværlig løsning, hvis jeg mener
> at kunne lære noget af det.
>
> > Desuden har jeg luret det: Hvis nu jeg laver awk-scriptet, hvor jeg så
> > skifter det regex, jeg skal bruge ud med et eller andet navn, kører
> > awk-scriptet igennem sed, der erstatter navnet med det egentlige regex,
> > og lader awk udføre resultatet af dette, så er det fedt.
>
> Det lyder som en af den slags ting, hvor man ikke engang selv kan finde
> hoved og hale i koden, hvis man skal læse den 14 dage efter, at man har
> skrevet den. Du vil kunne lave det langt mere effektivt i perl, og hvis
> du skriver det i pæn og læselig perl-kode, så er der også en chance for,
> at du selv kan finde ud af, hvad du har lavet bagefter.
>
> --
> -- Torben.
| |
Flemming Kjaer Jense~ (05-12-2000)
| Kommentar Fra : Flemming Kjaer Jense~ |
Dato : 05-12-00 02:06 |
|
>>>>> "Søren" == Søren Hansen <sha@mindpass.com> writes:
Søren> "Flemming Kjaer Jensen" <fkj@kom.auc.dk> wrote in message
Søren> news:4x2sno444ra.fsf@lada.kom.auc.dk...
>> >>>>> "Søren" == Søren Hansen <sha@mindpass.com> writes:
>>
>> Søren> Er der ikke en venlig sjæl, der kan forklare mig, hvordan
>> man Søren> laver dynamisk regex i awk? Problemet er, at jeg har et
>> Søren> fscking langt regex, jeg skal bruge flere steder i samme
>> Søren> awk-script. Hvorledes gør jeg lettest det? Proev perl eller
>> python for så undgår du sed + awk.
Søren> Hvordan kan det være et mål i sig selv at undgå sed og awk? Man
Søren> kan være ret meget mere sikker på at have sed og awk til
Søren> rådighed end perl og python.
Jo, det har du ret i, men de unix og unix-lignende systemer jeg har
haft adgang til har nu ret hurtigt enten haft per samt python
installeret.
Mht. til awk kan du komme ud for flere forskellige versioner af awk:
oawk (den gamle), awk (den gamle), nawk (den nye awk), gawk2 (gnu awk
version to), gawk (gnu awk version 3), samt mawk (??? en awk dialekt
der en open source og mindre end gawk2/3). Hvilken af den gamle og nye
awk du har fat er også afhængige af hvilken proprietær forhandlers
version af Unix du bruger. Hvilken du vælger "awk" at kode til da
"awk" altid er tilgængelig vælger man selv. Jeg gav dog måske for
hurtigt op efter at have forsøgt at danne mig et overblik og istedet
gik til Perl, Python, og andre scriptede løsninger.
Søren> Desuden har jeg sat mig i hovedet, at nu vil jeg have for vildt
Søren> meget styr på det her awk- og sed-gejl, så det her er en oplagt
Søren> mulighed. Desuden har jeg luret det: Hvis nu jeg laver
Søren> awk-scriptet, hvor jeg så skifter det regex, jeg skal bruge ud
Søren> med et eller andet navn, kører awk-scriptet igennem sed, der
Søren> erstatter navnet med det egentlige regex, og lader awk udføre
Søren> resultatet af dette, så er det fedt.
Det er vist bare og klø på og lad endelig dine erfaringer komme
læserne af newsgroupen til gode!
Mine erfaringer med awk er at bruge een version af en open source awk
til AWK programmering på tværs af Irix, Solaris og Linux platforme og
helst også sed, hvis regex bliver meget store.
mvh Flemming
| |
frank damgaard (05-12-2000)
| Kommentar Fra : frank damgaard |
Dato : 05-12-00 08:52 |
|
Flemming Kjaer Jensen <fkj@kom.auc.dk> wrote:
.....
> Mht. til awk kan du komme ud for flere forskellige versioner af awk:
> oawk (den gamle), awk (den gamle), nawk (den nye awk), gawk2 (gnu awk
> version to), gawk (gnu awk version 3), samt mawk (??? en awk dialekt
> der en open source og mindre end gawk2/3). Hvilken af den gamle og nye
> awk du har fat er også afhængige af hvilken proprietær forhandlers
> version af Unix du bruger. Hvilken du vælger "awk" at kode til da
> "awk" altid er tilgængelig vælger man selv. Jeg gav dog måske for
> hurtigt op efter at have forsøgt at danne mig et overblik og istedet
> gik til Perl, Python, og andre scriptede løsninger.
......
Jeg har brugt flere awk og det "grundlæggende-awk" gælder for alle.
Hvis man anvender non-standard extensions er det måske et problem.
Desuden er der øjensynlig kommet en "posix" awk-standard med visse
udvidelser.
Jeg har også brugt diverse awk under DOS, og her var de største
problemer DOS, da visse hurtige DOS-versioner havde problemer med
max. samlet 64kByte data osv.
Generelt er Awk uovertruffen for visse tekst-ind->tekst-ud opgaver
hvor perl&Co er alt for bøvlet (og avanceret), og sed alt for simpel.
Men tilbage til det oprindelige problem; det kunne let løses,
problemet var dels lidt shell/string/variable og lidt manglende awk-program...
NB.
Gnu awk's manual er her ganske god, og beskriver det meste
samt de få udvidelser der er i gnu-awk (inkl. posix).
--
Frank Damgaard
| |
Flemming Kjaer Jense~ (05-12-2000)
| Kommentar Fra : Flemming Kjaer Jense~ |
Dato : 05-12-00 18:09 |
|
>>>>> "frank" == frank damgaard <frank.damgaard@no.spam> writes:
frank> Flemming Kjaer Jensen <fkj@kom.auc.dk> wrote: ....
frank> Jeg har brugt flere awk og det "grundlæggende-awk" gælder for
frank> alle. Hvis man anvender non-standard extensions er det måske
frank> et problem. Desuden er der øjensynlig kommet en "posix"
frank> awk-standard med visse udvidelser.
frank> Jeg har også brugt diverse awk under DOS, og her var de største
frank> problemer DOS, da visse hurtige DOS-versioner havde problemer
frank> med max. samlet 64kByte data osv.
OK! Jeg har nok bare ramt ind i
mit-script-prygler-awks-datastrukturer-og-syntaks-for-meget
problemer, som jeg som nybegynder udi awk ikke havde styr på mellem
platforme :)
frank> Generelt er Awk uovertruffen for visse tekst-ind->tekst-ud
frank> opgaver hvor perl&Co er alt for bøvlet (og avanceret), og sed
frank> alt for simpel.
Jeg ender næsten altid med en python implementation, hvor jeg
efterhånden har bygget en del moduler, som jeg genbruger. Mine valg er
truffet ud fra at det afvikles uændret på forskellige platform hvilket
er forsk. Linux distributioner, Solaris (2.5.1. til 2.8), Irix (5.2
til 6.5) samt en enkelt gang imellem på Windows. Kodegenbrug af
moduler og objekt strukturer er dejligt, men hvem bryder sig om det
når det er sjovere at lave Perl one-liners eller implementere meget
funktionalitet ind i zsh shell scripts.
De awk scripts du får lavet, gemmer du dem i "moduler" eller
deciderede scripts, som du genbruger eller starter du forfra næsten
hver gang der er ny opgave (fordi det er nemt at gøre?!)?
frank> NB. Gnu awk's manual er her ganske god, og beskriver det meste
frank> samt de få udvidelser der er i gnu-awk (inkl. posix). -- Frank
frank> Damgaard
Kan du anbefale O'Reillys `sed & awk' bog?
mvh Flemming
| |
frank damgaard (05-12-2000)
| Kommentar Fra : frank damgaard |
Dato : 05-12-00 19:52 |
|
Flemming Kjaer Jensen <fkj@kom.auc.dk> wrote:
....
> De awk scripts du får lavet, gemmer du dem i "moduler" eller
> deciderede scripts, som du genbruger eller starter du forfra næsten
> hver gang der er ny opgave (fordi det er nemt at gøre?!)?
Der er så simple (ofte one/two-liners) at man laver dem på kommandolinie.
Skal det bruges flere gange kan man stoppe dem ind i et shell-script
og er de rigtig store så får de en egen .awk fil.
Og ellers har jeg mine scripts under ~frank/bin på min hjemmepc og
konti.
I øvrigt et lille kommandlinie program lavet med awk til bash og tcsh:
http://www.sslug.dk/~frank/calc_tip.html
" I bash opstart :
function calc () {
awk "BEGIN { print $* ; }"
}
"
PS.
Prøv at se under http://home3.inet.tele.dk/frda/#date :
http://home3.inet.tele.dk/frda/src/datefunc.awk
Et eller andet sted har jeg an bash udgave af dette..... (udover C)
Nu er dette vist et dårlig eksempel for hvad awk er specielt god til,
men date-eksemplet viser at algoritmer også kan anvendes i awk.
Jeg bruger det ofte i forbindelse med scripts der skal tygge på
diverse logfiler.
--
Frank Damgaard
| |
|
|