parsování souborů

Ing. Vlastimil Pospíchal vpospichal na tiscali.cz
Úterý Duben 1 13:00:29 CEST 2003


On Tue, Apr 01, 2003 at 10:44:52AM +0200, Martin Proks wrote:
> >Potřeboval bych ze souboru vytáhnout nějaká data a nevím si s tím rady
> >3. najít řádek obsahující určitý řetězec a ze třetího řádku za ním přečíst
> >určitý údaj
> 
> Zpusobu je milion: sed, perl, awk, ................
> Ja si asi nejlip rozumim s awk/gawk, takze:
> 
> awk '{ if ( index($0, "co") != 0 ) {
>           getline; getline; getline;
>           print $0;
>           # $0 cela radka, $1 prvni slovo, $2 druhe,...
>        }
>       }' "soubor"

Trochu mě zaráží, když z takových skvělých jazyků, jako je awk, perl
nebo python spousta programátorů udělá obyčejný procedurální jazyk.
Přitom při využití silných stránek těchto nástrojů bývají výsledné
skripty nejen kratší a čitelnější, ale také rychlejší.

Daleko srozumitelnější je podle mne využití přirozených vlastností awk:

  awk '/retezec/ {getline;getline;getline;print}' soubor

Neříkám, že si s awk rozumím nejlépe, ale vždy se z nějakého jazyka
(zejména skriptovacího) snažím vyždímat maximum při minimální délce
zápisu, minimu cyklů a dobré srozumitelnosti.

Pro ilustraci přikládám skript, kterým filtruji maily ze sourceforge.net
pro rychlou orientaci (kompletní texty si samozřejmě nechávám také):

#!/bin/bash
/usr/bin/awk 'BEGIN {stav=0}
    stav==0 && /^$/ {stav=1;print;next}
    stav==0 && (/^From/||/^To/||/^Subject/) {print;next}
    /http:\/\/sourceforge\.net/ {print line;print}
    {line=$0}' |\
  /usr/bin/formail

Kit
-- 
Ing. Vlastimil Pospíchal
http://www.hoteldrnholec.cz


Další informace o konferenci Talk