Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: timmynovak 21 Listopadu 2011, 15:42:32
-
Ahoj, potřeboval bych zpracovávat nové přírůstky ze syslog, které běžně vidím pomocí:
tail -f /var/log/syslog
ale nemohu příjít na to, jak bych třeba ve skriptu a cyklu mohl postupně do proměnné načítat to, co tail vrací a s tím pak něco dělat. Je to asi kravinka, ale ne a ne na to přijít:( Díky za rady či ukázkové příklady.
-
promenna="$(tail -f /var/log/syslog)"
-
Předchozí řešení je dobré, ale tuším, že funguje jen v modernějších shellech. IMHO klasické je použít:
`command`
což vrátí výstup příkazy (spustí si to subshell a zkopíruje výstup), čili můžeš udělat:
x=`command`
Ale pokud to nepíšeš pro nějaký prehistorický systém, tak použij předchozí odpoveď. Tohle postuji tak pro info :).
-
děkuji
-
děkuji
Jak jsi to tedy vyřešil? Mně žádné z uvedených řešení nefunguje: `tail -f` se musí zabít, aby se ukončil.
-
děkuji
Jak jsi to tedy vyřešil? Mně žádné z uvedených řešení nefunguje: `tail -f` se musí zabít, aby se ukončil.
-f, --follow[={name|descriptor}]
output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent
cili ten tail proste bude neustale bezet, protoze ceka na prirustek souboru, aby ho mohl vypsat
EDIT: ted koukam, ze to do te promenne nezapisuje. vi nekdo proc?
-
EDIT: ted koukam, ze to do te promenne nezapisuje. vi nekdo proc?
Zapisuje, ale teprve až sejmeš ten proces, můžeš proměnnou přečíst. Resp. proměnná se vytvoří, až bude kompletní obsah.
V zásadě jde o to, že spustíš subshell, který něco tvoří a teprve až skončí, výsledek se přesune do proměnné.
-
Takže bych v bashi musel periodicky načítat celý soubor (nebo zabíjet `tail`, jenže pak by `tail -f` ztrácelo veškerý smysl) a dále sledovat nějaký marker kde jsem v souboru skončil, abych zjistil, co nového se mi načetlo.
Existuje nějaké čistší řešení?
-
aaaha, tak mi to fakt nefunguje:(
-
Možná by ti stačilo něco jako
tail -f /var/log/syslog | while read line; do echo $line; done
nový řádek je vždy v proměnné line.
-
skvělé, děkuji, funguje to přesně tak, jak jsem potřeboval, děkuji!