shell-script-pt
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]