egy shell-script kérdés ✓

hogy lehetne

while [ 1 ]; do wc -l filename; sleep 60; done

anélkül hogy előlről kellene beolvasnia, ha a folyamatosan a végére ír valami a filename-nek?

ps: jó lenne sh-ban, de (powershell kivételével) akármiben lehet

pps: megfogalmazom szövegesen is: egy log fájl percenkénti növekménye kell, sorokban.
(Mivel log fájl, nem percenként beolvasva az egész fájlt.)

nem tudom szabad-e a tárgyba unicode karaktert tenni..

Hozzászólások


lc=0
while read line <file; do
  lc=$(expr $lc + 1)
  sleep 60s
done

Valami ilyesmi esetleg?

De... hm. Lassunk egy masik megoldast...

Elso lepesben megnezzuk a file meretet, es megszamoljuk a sorokat, ez a kiindulopont. Utana alszunk egy percet, megnezzuk a file meretet (stat?), kivonjuk belole az elozot, ennyivel nott a merete. Jajjdejo! De ugye sorokban kell nekunk, hat tail -c ${kulonbozet} | wc -l. Ennyivel nott az eltelt egy perc alatt a file sorainak szama.

Shellben, kb a fenti, picit optimalizalva:


fs=$(stat -c '%s' ${file})
while 1; do
  sleep 60s
  lcd=$(tail -c +${fs} ${fs} | wc -l)
  fs=$(stat -c '%s' ${file})
done

Ha minden igaz akkor $lcd-ben van hogy hany sor kerult hozza a filehoz az elmult percben. Lehet, hogy -c +$(expr $fs + 1) kell, nem teljesen vilagos a man oldal. De valami ilyesmi ;)

- naív mo lehetne a "tail -c $a|wc -l; a=`fájlméret file`; sleep 60" de akkor mi garantálja hogy a wc és a fájlméret parancs közt nem volt növekmény

- a read line-os változatot nem sikerült átfaragnom működőképesre

- a "tail -f"-et továbbra sem értem

Ha nem feltétlen shellscript kell, akkor a logtail pontosan erre való.

man logtail:
logtail reads a specified file (usually a log file) and writes to the standard output that part of it which has not been read by previous runs of logtail. It prints the appropriate number of bytes from the end of logfile, assuming that all changes that are made to it are to add new characters to it.

Talán így:


tail -c +0 -f logfajl >> tempfajl &

while [ 1 ] ; do
        wc -l tempfajl
        :> tempfajl
        sleep 60
done

Ez kell neked, csak akkor írja bele a file új méretét a file.size-ba, ha volt új sor:


$ tail -n +0 -f file |
(size=0; while read; do let size++; echo $size > file.size; done) &
$ while true; do cat file.size; sleep 60; done

Ez egy picit races, nem?

Ha epp akkor catolodna a file amikor echo ir bele, akkor elofordulhat - bar igen valoszinutlen ilyen egybeeses -, hogy a tempfile epp 0 meretu, nem?

Szemely szerint en nem szeretem a tempfileokat, inkabb legyen egy picit hosszabb a kod, background process es tempfile nelkul.. De izlesek es pofonok :)