[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Redirecionar para stdout e arquivo simultaneamente
From: |
Marcio Gil |
Subject: |
Redirecionar para stdout e arquivo simultaneamente |
Date: |
Thu, 18 Jun 2009 17:37:00 -0000 |
User-agent: |
eGroups-EW/0.82 |
Pessoal,
Estou entrando agora no grupo, espero não só tirar minhas dúvidas como dividir
o pouco conhecimento que tenho sobre shell script.
Me cadastrei no grupo pois não consegui descobri se existe uma maneira de
redirecionar a saída de um script para um arquivo e para stdout simultaneamente.
Explicando: eu criei um script para criar um resumo dos meus arquivos de log
(que está anexado no final da mensagem). Então eu utilizo assim:
logsum -vm Cvf-*.log >Resumo.txt ; cat Resumo.txt
Ou seja, ele salva o resumo em um arquivo texto e depois o exibe. Gostaria que
as linhas fossem sendo exibidas enquanto o arquivo é criado, já que o processo
pode demorar vários segundos quando o número de arquivos é grande. Não sei se
esta é uma dúvida básica.
A seguir eu anexei o meu script caso alguem tenha um sugestão ou queira
aproveitar algo.
--- arquivo logsum ---
#!/bin/bash
#
# Monta resumo de arquivos de log
# Criado por: Márcio Gil Maldonado
#
CMD=`basename $0`
VER="0"
PER="0"
MAQ="0"
OLD="0"
FILES=""
ERROR=""
while [ -n "$1" ] ; do
case "$1" in
-*)
if [ "$1" == "--help" ] ; then
echo "Monta resumo de arquivos de log"
echo
echo "Uso:"
echo " $CMD [opções] arquivos"
echo
echo "Opções:"
echo " -v Extrai a versão do nome do arquivo"
echo " -p Separa o período da versão (se -v foi especificado)"
echo " -m Extrai o nome da máquina do nome do arquivo"
echo " -o Listar campos no formato antigo"
echo
echo "Formato dos arquivos:"
echo " SIGLA[-Versão]-AAMM[-Máq].log"
echo
echo "Campos (formato antigo, opção -o):"
echo " [Máq] [Versão] [AAMM] data-ini data-fin n-dias n-ini n-fin
n-erros"
echo
echo "Campos (formato novo):"
echo " [Máq] [Versão] [AAMM] data-ini data-fin n-dias n-erros n-trav
n-av"
echo
echo " [Máq]: Máquina (opcional)"
echo " [Versão]: Versão ou Versão-AAMM"
echo " [AAMM]: Período (ano e mês)"
echo " data-ini: Data inicial"
echo " data-fin: Data final"
echo " n-dias: Número de dias funcionando"
echo " n-ini: Número de inicializações"
echo " n-fin: Número de finalizações"
echo " n-erros: Número de erros"
echo " n-trav: Número de travamentos"
echo " n-av: Número de violações de acesso"
echo
exit 0
fi
OPT="$1"
case "$OPT" in
-*v*) VER="1"; OPT=`echo $OPT | sed s/v//`
esac
case "$OPT" in
-*p*) PER="1"; OPT=`echo $OPT | sed s/p//`
esac
case "$OPT" in
-*m*) MAQ="1"; OPT=`echo $OPT | sed s/m//`
esac
case "$OPT" in
-*o*) OLD="1"; OPT=`echo $OPT | sed s/o//`
esac
if [ "$OPT" != "-" ] ; then
ERROR="$ERROR $OPT"
fi
;;
*)
FILES="$FILES $1"
esac
shift
done
if [ -n "$ERROR" ] ; then
echo -en "$0: Parâmetro inválido: $ERROR\n" >&2
echo "$0: Execute '`basename $0` --help' para mais informações." >&2
read
exit 1
fi
for f in $FILES ; do
t=${f%.*}
line=""
if [ "$MAQ" = "1" ] ; then
m=${t##*-}
t=${t%-*}
line="$m"$'\t'
fi
if [ "$VER" = "1" ] ; then
v=${t#*-}
if [ "$PER" = "1" ] ; then
p=${v##*-}
v=${v%-*}
line="$line$v"$'\t'"$p"$'\t'
else
line="$line$v"$'\t'
fi
else
p=${t#*-}
line="$line$p"$'\t'
fi
dti=`grep "Sistema inicializado - " $f | head -n 1 | cut -f 4 -d " "`
dtf=`grep "Sistema inicializado - " $f | tail -n 1 | cut -f 4 -d " "`
ndd=`grep "Sistema inicializado - " $f | cut -f 4 -d ' ' | sort -mu | wc -l`
nii=`grep "Sistema inicializado - " $f | wc -l`
nff=`grep " - Sistema finalizado." $f | wc -l`
nee=`egrep "^([0-9]+:){2}[0-9]+ - [A-Za-z]+:" $f | cut -f 3- -d ' ' | sort
-mu | wc -l`
nav=`egrep -i "^([0-9]+:){2}[0-9]+ - [A-Za-z]*AccessViolation[A-Za-z]*:" $f |
cut -f 3- -d ' ' | sort -mu | wc -l`
ntr=$(( $nii - $nff ))
eval "udf=\$MAQ$m"
declare "MAQ$m=$dtf"
if [ "$udf" = "$dti" ] && (( $ndd > 1 )) ; then
ndd=$(( $ndd - 1 ))
fi
if [ "$OLD" = "1" ] ; then
echo "$line$dti"$'\t'$dtf$'\t'$ndd$'\t'$nii$'\t'$nff$'\t'$nee
else
echo "$line$dti"$'\t'$dtf$'\t'$ndd$'\t'$nee$'\t'$ntr$'\t'$nav
fi
done
- Redirecionar para stdout e arquivo simultaneamente,
Marcio Gil <=