es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El caso no funciona al examinar la salida de “tail”.

No puedo encontrar las razones por las cuales mi declaración case no funciona al examinar la salida de tail.

tail -F -n1 /var/log/pihole.log |
while read input; do
 echo "$input" | hexdump -C            # solo para comparar físicamente la salida
 case $input in
   cached|blacklisted|blocked)
     echo "¡Hemos encontrado una coincidencia!";;
   *)
     echo "¡Sin coincidencia!"
 esac
done

Esto siempre retorna “Sin coincidencia”, incluso si las cadenas están en $input.

:~ $ ./pihole_test.sh
00000000  4a 61 6e 20 31 20 31 31  3a 35 35 3a 35 38 20 64  |Jan 1 11:55:58 d|
00000010  6e 73 6d 61 73 71 5b 36  39 36 5d 3a 20 65 78 61  |nsmasq[696]: exa|
00000020  63 74 6c 79 20 62 6c 61  63 6b 6c 69 73 74 65 64  |ctly blacklisted|
00000030  20 70 6c 61 79 2e 67 6f  6f 67 6c 65 2e 63 6f 6d  | play.google.com|
00000040  20 69 73 20 30 2e 30 2e  30 2e 30 0a              | es 0.0.0.0.|
0000004c
¡Sin coincidencia!
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con la declaración case que no funciona en este script podría deberse al hecho de que tail está configurado para monitorear continuamente el archivo de registro y enviar nuevas líneas al bucle while. Esto significa que la declaración case no recibe toda la línea como $input, sino solo una parte de cada línea a medida que es enviada por tail.

    Para solucionar esto, podemos modificar el script para que espere hasta que se haya recibido toda la línea antes de aplicar la declaración case. Esto se puede lograr utilizando la opción -r con read, que permite que las barras invertidas se lean como parte de la línea. También podemos agregar una verificación para asegurarnos de que la línea no esté vacía antes de aplicar la declaración case.

    Aquí hay una versión actualizada del script:

    tail -F -n1 /var/log/pihole.log |
    while read -r input || [[ -n "$input" ]]; do
     echo "$input" | hexdump -C            # solo para comparar físicamente la salida
     if [[ -n "$input" ]]; then           # verifica si la línea no está vacía
       case $input in
         cached|blacklisted|blocked)
           echo "¡Tenemos una coincidencia!";;
         *)
           echo "¡No hay coincidencia!"
       esac
     fi
    done
    

    Con estas modificaciones, la declaración case ahora debería funcionar como se espera, y el script solo aplicará la declaración case una vez que se haya recibido toda la línea.

Comments are closed.