[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