[Linux-Biella] Script bash che prende dati dallo standard input come grep/awk/sed: da pipe, tail ecc...
Daniele Segato
daniele.bilug a gmail.com
Lun 25 Maggio 2009 15:33:31 CEST
2009/5/22 Daniele Segato <daniele.bilug a gmail.com>:
> tail -f mioFileDiLog.log | mioscript.sh
mi auto rispondo
> si può da script?
si: fintantoché ciò che scrivi nello script segue una pipe...
cioè se puoi "copiarlo e incollarlo tutto su una sola linea e funziona"
esempio:
#!/bin/sh
# mio script
grep qualcosa $1 | \
sed 's/.../.../' | \
awk '...' \
ecc...
> sapete come?
yeppa...
lo script sopra va benone... se non c'è alcun $1 nel primo grep si
piglia in input ciò che arriva da standard input...
il motivo per cui pensavo non funzionasse è il buffering!
infatti grep, sed e awk bufferizzano...
quindi se si fa:
tail -f | grep | sed | awk
non si ottiene una pippa finché non si riempiono i buffer o finché non
"muore" tail
disabilitare il buffering però comporta perdita di prestazioni...
quindi ho fatto così:
#!/bin/sh
if [[ ! $1 ]]; then
INTERACTIVE_GREP="--line-buffered";
INTERACTIVE_SED="-u";
INTERACTIVE_AWK="-W interactive";
fi
grep $INTERACTIVE_GREP qualcosa $1 | \
sed $INTERACTIVE_SED 's/.../.../' | \
awk $INTERACTIVE_AWK '{ ... }'
così se gli passo un parametro si piglia quello e usa i buffer,
altrimenti si appende al tail....
mi resta la non efficienza in caso di pipe senza tail però ora la
risolvo mettendo l'interactive su un opzione dello script :)
thanks to all!!!
e cmq ho intenzione di colmare la mia mancanza di conoscenza di perl :)
se avete link da consigliare per un quick start ben fatto sono i ben venuti :)
Maggiori informazioni sulla lista
Linux