Sziasztok.
Újabb gondom van.
BASH alatt szeretnék egy idő alapű statisztikát írnom.
Lényege:
Vannak egy szöveges fájlban sorok, aminek a kinézete kb ennyi:
Év-Hó-Nap óra:perc:mp,ms a=
sallang u=
Ebből kellene csinálnom egy olyan kimenetet, hogy adott hónapban (evho változó vágja az elejét, KÉSZ) adott programot (szintén megoldva) adott user (ez is szűrve vagyon) hányszor használt.
For ciklussal gondoltam elindulni, első körben adott havi sorokat (teljes sort) rakok át egy átmeneti fájlba.
Erre a fájlra fut le a programok szűrése, majd egy újabb (beágyazott) for ciklussal egy program kimeneteit rakom át egy másik tmp fájlba. Ebből a fájlból szűröm az abban dolgozott felhasználókat.
Amit viszont nem tudok belőle kiszedni, hogy valahogy strukturált kimenetem legyen.
Valami ilyesmit szeretnék:
év-hó, program, felhasználó.
És soronként minden programra.
Ha simán echo-val akarom kinyerni az evho változót, akkor az összes dátum automatice benne van.
foreach-et meg nem ismer a bash :S
Perlre meg emiatt nem váltanék, mert a másik gép (amin élesben fog futni) nem tartalmazza.
A változók tartalma meg van, de minden általam kért adat benne van :(
Köszi a segítséget előre is.
- 4514 megtekintés
Hozzászólások
- A hozzászóláshoz be kell jelentkezni
Hát pedig erre van ugye :D
egy jó kis hash "user-prog" kulccsal, aztán ha létezik a kulcs hozzáadjuk az időt, ha nem, akkor meg csak marad a sorból kiszedett adat. Ennél egyszerűbben nem lehet.
Éljen a PERL!!!!
- A hozzászóláshoz be kell jelentkezni
Egy listába kiszűröd a lehetséges dátumokat (mondjuk sed+sort (-u)).
Egy listába kiszűröd a lehetséges user-eket (mint előbb).
Egy listába kiszűröd a lehetséges programokat (mint előbb).
Ezután képzed ezek direkt szorzatát és úgy haladsz végig. Persze nyilván nem ez a leghatékonyabb és egy idő után tetű lassú is, de ha nem lehet más eszköz, egy brute-force-nak jó ez.
Mittomén:
datumok=$(sed -r "s@([0-9]{4}-[0-9]{2}).*@\1@" logfile)
userek=$(sed -r "s@.*u=(.*)@\1@" logfile)
programok=$(sed -r "s@.*a=(.*) u=.*@\1@" logfile)
for datum in $datumok; do for user in $userek; do for program in $programok; do
echo $datum $user $program $(grep -ec "^$datum.*a=$program.*u=$user" logfile)
done; done; done
Biztos vannak benne hibák, de első nekifutásra nem rossz ez :)
Hatékonyság miatt lehetne pl. inkább dátum-user párossal dolgozni (tehát nem $datumok és $userek lesz, hanem $datumok_userek) vagy még inkább user-program párossal (gondolom, nem minden programot futtat minden user, így legalább kevesebbszer kell grep-pelni).
- A hozzászóláshoz be kell jelentkezni
foreach így nincs, viszont van:
MY_ARRAY=(a b c d e f);
for a in ${MY_ARRAY[*]}
do
.....
done
--
Coding for fun. ;)
- A hozzászóláshoz be kell jelentkezni
Pont az ilyen mintakeresés + egyszerű műveletek végrehajtására szolgál az awk, amely egy igen egyszerű nyelv: a tömör dokumentációja - hajdan kipróbáltam - 7 oldalon elfér; egyébként pedig a bash/grep/sed ismeretével a nyelv felfogásának jó része teljesítve. Nagyon-nagyon valószínűtlen olyan rendszert találnod, amelyen semmilyen verziója nincs.
Ez a feladat 10 soron belül megoldható azzal.
Ráadásul a készségszintű elsajátítása után a perl automatikusan jön.
Némi segítség, ha úgy gondolnád: http://progkor.inf.elte.hu/MAN/HTML/awk.htm
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Ahogy ide írtam, jött az ihlet, szal már elég jó nyomon vagyok. Már csak egy összesítést kell csinálnom, és mehetek a középvezetőket interjúvolni.
Az ötleteket mindenkinek köszönöm, bármennyire is úgy néz ki, segítettetek :)
- A hozzászóláshoz be kell jelentkezni