/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
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


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408900
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste