[linux] script

Jarry guru jarry na gmx.net
Středa Prosinec 1 17:23:23 CET 1999


Dado Jan wrote:

>> #!/bin/sh
>> while read premenna; do
>> echo $premenna            # chcem len vediet, ci ju ozaj nacital!
>> done
>> 
>> a teraz:
>> # tail -0 -f /var/log/messages | grep -i 'failed\|unauthorized' |
>> ./moj.script
>> Ctrl-C
>> #
>> 
>> a nic!

> Nie je problemom ten while read?
> Kedy skonci? Na kazdom riadku? na EOF?
> Vyzera to na EOF, ktory nikdy nepride, kvoli tail -0 -f....

man bash:

SHELL BUILTIN COMMANDS
<snip>
 read [-r] [name ...]
      One  line  is read from the standard input, and the
      first word is assigned to the first name, the  sec
      ond  word to the second name, and so on, with left
      over words assigned to the  last  name.   Only  the
      characters  in  IFS  are  recognized as word delim
      iters.  If no names are supplied, the line read  is
      assigned to the variable REPLY.  The return code is
      zero, unless end-of-file is encountered.  If the -r
      option  is  given,  a backslash-newline pair is not
      ignored, and the backslash is considered to be part
      of the line.

Ak dobre rozumiem, tak len jeden riadok (ukonceny EOL, nie
EOF!) sa nacita do premennej. Dalsi riadok uz do dalsej
(ak je definovanych viacero [names], inak "read" zrejme
na ostatne riadky necaka, a ide sa dalej (len ci naozaj?).

A ake su to tie "Only characters in IFS", ktore sa chapu
ako oddelovace slov? Su to aj medzery? Potom je to na
draka, lebo aj tak sa cely riadok nenacita do jednej
premennej...        :-(

BTW, drobna neprijemnost je to, ze "read" je shell 
build-in command, nie system command (preto asi nefachci,
ked ho dam priamo do pajpy). Na hpux je "read" (aj?) unix
command (nie len vstavany do shellu). Mam na mysli:

man read
read [-r] var ...      (hpux), nie ako na linuxe:
man read
read - read from a file descriptor (linux Programmer's man)

Matej Kovac wrote:

> #!/bin/bash
> while true; do
> lines=`/usr/bin/wc -l /var/log/messages | /bin/gawk '{ print
> $1 }'`
> oldlines=$[$oldlines + 0];
> newlines=$[$lines - $oldlines]
> /usr/bin/tail -$newlines /var/log/messages | /bin/grep fail
> $oldlines=$lines
> sleep 10;
> done;
>
> a mas to kazdych 10 sec na screene. jedna pajpa a je to v
> maile.... hej, a zabudol som pri grepe na unauth... :-)

To je presne to, co mi nestaci (dostat to na screen).
To dokaze vypluvat aj ten riadok:
tail -0 -f /var/log/messages | grep -i 'failed\|unauthorized'
Ja to musim dostat do subjektu mailu, ktory sa potom ma hned
odoslat!

> a na nejake bodkociarky :-), ale wrci to. pisal som to rychlo.
> ten cas za sleep je irelevantny, mailer ti asi necheckuje
> kazdych 10 sec, ale skor raz za minutu. mozes tam vnorit aj
> jeden echo beep >/dev/console :-)

OKI, upravim a odskusam zajtra, dnes uz mi to nemysli. Ale
to uz nie je take elegantne riesenie. Sleep 10 s moze byt
velmi vela (co ked sa za ten cas vyskytne viac takych riadkov?)
ale aj velmi malo, lebo sa bude zbytocne tocit dookola,
a sosat nejaky ten CPU time. Ja viem, nevela, ale keby
som kazdu blbu smycku robil takto, neviem, kde by to skoncilo.
V tomto smere su tie pajpy predsa len lepsie. Prikaz v pajpe
caka, kym ten pred nim neda nejaky vystup (a zaroven ten za
nim uz musel skoncit). To by bolo elegantne riesenie...

BTW, ta mail adresa ma byt moj emal-sms portal, takze na
mobile to uvidim hned, ako to pride (ak nieco pride!).
Preto musi byt ten riadok v SUBJ, lebo len ten dostanem ako
SMSku...

Thnx 4 tips!

Jarry

-- 
Sent through Global Message Exchange - http://www.gmx.net




Další informace o konferenci linux