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..
- 2083 megtekintés
Hozzászólások
kicsit más, de:
$ tail -f filename
- A hozzászóláshoz be kell jelentkezni
szerk: bocs a -f elkerülte a figyelmem:)
- A hozzászóláshoz be kell jelentkezni
Nem tudom mire kell, azért írtam a tail-t..
Szóval mire kell?
- A hozzászóláshoz be kell jelentkezni
arra amit írtam, a tail -f jónak tűnne bár még nem jöttem rá hogy kellene használni
- A hozzászóláshoz be kell jelentkezni
$ touch test
$ tail -f test
--
másik terminálon:
$ while true; do date >> test; sleep 10; done
- A hozzászóláshoz be kell jelentkezni
de a sleep alatt akármennyi touch lehet
- A hozzászóláshoz be kell jelentkezni
nem értem
a filename-be egy ismeretlen program
- néha ilyet hajt végre: "echo hali >>filename" v. "tee -a filename"
- egy "tee filename" mindvégig rajta van
mindkettőre érdekelne megoldás de az igazi az lenne ha ettől független lenne
- A hozzászóláshoz be kell jelentkezni
pontosabban a wc és a sleep helyére képzelhetsz más programot, a lényeg hogy a wc a tartalmát olvassa, a sleep alatt pedig idő telik el
szerk: persze úgy olvassa a wc helyén lévő program hogy elég lenne neki a a program legutolsó futása utáni a fájlhoz hozzáírt adat
- A hozzászóláshoz be kell jelentkezni
lc=0
while read line <file; do
lc=$(expr $lc + 1)
sleep 60s
done
Valami ilyesmi esetleg?
- A hozzászóláshoz be kell jelentkezni
ez nem soronként vár egy percet?
- A hozzászóláshoz be kell jelentkezni
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 ;)
- A hozzászóláshoz be kell jelentkezni
- 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
- A hozzászóláshoz be kell jelentkezni
Semmi sem garantalja. Azt lehet meg betenni, hogy tail elott megnezed a file meretet, tail -c +${elozomeret}, ezt lelimitalod $meret-$elozomeret -re, es ugy wc -l. Ez megved a csuszastol.
tail -c +${elozomeret} | head -c $(expr ${meret}-${elozomeret}) | wc -l
elozomeret=${meret}
- A hozzászóláshoz be kell jelentkezni
jónak tűnik, de még gondolkozom egy szebb megoldáson:)
- A hozzászóláshoz be kell jelentkezni
jól értem a "tail -f"-et hogy az a feladatot oda egyszerűsíti hogy a bemeneti fájl egy csővezeték kimenetévé egyszerűsödik?
tehát a "tail -c +0 -f fájl"-t kellene használni, de hogyan?
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
eredetileg bármi jó lenne, de mivel egy ilyen egyszerű feladatot nem sikerült kapásból megoldanom, kihívás lett belőle:)
ps: kösz a logtailt, így megtaláltam a logtools-t is:) , perszea kihívás továbbra is fennáll:)
- A hozzászóláshoz be kell jelentkezni
Talán így:
tail -c +0 -f logfajl >> tempfajl &
while [ 1 ] ; do
wc -l tempfajl
:> tempfajl
sleep 60
done
- A hozzászóláshoz be kell jelentkezni
ez szépnek tűnik:) (a tempfájl kivételével:)
de mi az a kettőspont? tudom rtfm de azért :-ra kicsit nehéz rékeresni
ps: ha a wc és a tempfile kinullázása közt volt növekmény? vagy rosszul értelmezem a scripted?
- A hozzászóláshoz be kell jelentkezni
Hasonló az
echo "" >
-hoz csak nem rak sortörést a végére.
- A hozzászóláshoz be kell jelentkezni
nem a true alias-a?
- A hozzászóláshoz be kell jelentkezni
Azt hiszem ez lesz az (a man bash-ból):
SHELL BUILTIN COMMANDS
: [arguments]
No effect; the command does nothing beyond expanding arguments and performing any specified redirections. A zero exit code is returned.
De lehet hogy rosszul értem:)
- A hozzászóláshoz be kell jelentkezni
> ez szépnek tűnik:) (a tempfájl kivételével:)
meg a race condition és az egyre lassuló futás kivételével...
- A hozzászóláshoz be kell jelentkezni
Miért lassulna le? Hogyan lehetne kivédeni race conditiont?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
pont ilyet álmodtam:)
- A hozzászóláshoz be kell jelentkezni
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 :)
- A hozzászóláshoz be kell jelentkezni
size=0
tail -n +0 -f file | (while read; do let size++; done) &
while true; do echo $size; sleep 60; done
?
btw: policy mit mond, címbe lehet ilyet szúrni: ✓ ✔ ?
- A hozzászóláshoz be kell jelentkezni