Potreboval jsem zformatovat vystup z prikazu mpls na ftp klientovi (stahne mi to strukturu ftp do textoveho souboru). Pomoci regularnich vyrazu jsem si s tim pekne pohral, ale problem je ten ze zformatovani 50MB (cele to funguje jako prohledavac ftp serveru na koleji) textovych informaci trva hrozne dlouho. Na mem Duronu 1.1 GHz neco pres hodinu. zkousel jsem spoustet vice procesu najednou,ale pak se na pocitaci nedalo pracovat. Zajimalo by me tedy, zda je nejaka moznost jak to urychlit,bylo by to rychlejsi mit to napsane v C?
Jinak mi moc pomohl serial regularni vyrazy v minulosti uverejneny na rootovi.
sice nevim, co to to mpls je, ale to asi neni dulezite. kdyz je neco pomale, tak urcite pomuze napsat tomu program "na miru"... Regularni vyrazy jsou dost obecne reseni a proto se za ne plati pomalosti (i kdyz to je kdovijak optimalizovane)...
Taky je dobre v reg. vyrazech pocitaci nejak ulehcit Hned na zacatku promaznout vsechno, co neni treba, aby se tim nemusel zbytecne zabyvat a zmensil se objem dat, lepe formulovat vyrazy a podobne.
Pokud to je vazne dulezite, rozhodne by stalo za to to v nejakem jazyku prepsat bez (nebo jen s minimalnim) pouzitim regularnich vyrazu. (Kdyz uz ne v C, tak alespon v Perlu, PHP...)
vsechny prikazy delam v bashi:
zkusim tady vlozit zdrojak ale nekamenujte mne za moje programatorske schopnosti,nejsem programator :)
takto vypada nenaformatovany text:
/d:/My Music/Alba/Clawfinger:
total 397792
-rw-rw-rw- 1 user group 1622 May 27 2002 !Clawfinger.m3u
---------- 1 user group 4696317 Jun 27 2000 Back To The Basics.mp3
a takto naformatovany:
HSTNAME/d:/My Music/Alba/Clawfinger/!Clawfinger.m3u 1622 27 01 2003 09:47:54
HOSTNAME/d:/My Music/Alba/Clawfinger/Back To The Basics.mp3 4696317 27 01 2003 09:47:54
a toto je ten skript:
#!/bin/bash
#cesta=/ #promenna cesta #nakonec zbytecne
datum=`date '+%d %m %Y %T'`
sed -e s/:$//g ./ftpseznam/$1 > temp #odstrani : na konci radky
sed -e /^total\ \[0-9]/d temp >temp2 #odstrani zbytecnost o total cislo
sed -e 's/\([^ ]*[ ][ ]*\)\{4\}\([^ ]*\)[ ][ ]*\([^ ]*\)[ ][ ]*\([^ ]*\)[ ][ ]*\([^ ]*\)[ ][ ]*\(.*\)/\6 \2/' temp2 >temp
#spocitat pocet radku souboru
pocet=`wc -l temp | cut -c0-7`
#echo $pocet
for i in $(seq 1 $pocet)
do
radek=`sed ''$i'q;d' temp` #2X RYCHLEJSI !!!
#echo "$radek"
if [ -z "$radek" ] #pokud je radek prazdny, vzdy kdyz nasleduje cesta
then
#echo PRAZDNY #zde posun o jedno dolu ++i ;nacteni cesty do promenne; --i;
i=`expr $i + 1`
radek=`sed ''$i'q;d' temp`
cesta=$radek
#echo $radek #je to zbytecne tento radek se opakuje i jako soubor
i=`expr $i + 1`
else
x=$radek # pri primem dosazeni mi to blblo
y=$cesta
if [ "$x" != "$y" ]
then
#echo tento radek NECHAT
echo $1$cesta/$radek $datum>>./ftpformat/$1
#echo $1/$cesta/$radek
fi
fi
done