¿Hay alguna manera de hacer un pitido de cola?


23

¿Hay alguna forma de emitir tail -Fo emitir un lesspitido (hacer sonar el timbre en una terminal) cuando entran nuevos datos (se agrega una nueva línea al archivo). ¿O hay alguna otra utilidad de Unix para hacer esto en Linux o Mac?

Respuestas:


13

Una idea puede ser canalizar la salida de tailthrough sedy reemplazar la nueva línea con campana / nueva línea.

Pero existe una solución más fácil si se usa taildentro de una ventana x . Allí puede ejecutar una acción cuando el contenido de la ventana cambia (parpadeo, campana, lo que sea).


44
No reemplace la nueva línea, agréguela al final de la línea.
Kevin

@Nils, esta sedidea es brillante, pero no sé lo suficiente 'sed' para que funcione, parece que no puedo capturar nuevas líneas en la expresión regular de la manera habitual (que estoy acostumbrado), creo que necesito decirle a sed no interprete el flujo entrante línea por línea.
Ali

55
@Ali De hecho, sed actúa línea por línea y no ves directamente las nuevas líneas. sed -e $'s/$/\a/'agrega un $'\a'(carácter de campana en la sintaxis ksh / bash / zsh) al final de cada línea.
Gilles 'SO- deja de ser malvado'

¡Gracias @Gilles, funcionó como un encanto (en una Mac también)! sedregexpt es un poco extraño para mis ojos ingenuos.
Ali

1
@Gilles: Tenga en cuenta que la $'...'sintaxis no es universal. Por ejemplo, [t] csh no lo admite.
Keith Thompson el

13

si usa GNU screen, puede configurarlo para que "mire" la ventana con la cola, y lo alertará en su barra de estado, o por la campana definida de su termcap, que hay una nueva salida en esa ventana.

http://www.gnu.org/software/screen/manual/html%5Fnode/Monitor.html#Monitor


editar: solo tuve que agregar esto, ya que mencionaste mac os x

solo por diversión, si estabas buscando algo en particular, puedes usar el saycomando de Mac OS X para leer el archivo que estás viendo. solo obtenga el logtailcomando, de:

http://www.hmug.org/pub/MacOS_X/BSD/Administration/Log/logcheck/

Y úsalo en un script como:

#!/bin/bash

file=$1
offset=$(basename "$1")

# while true... let this thing run until it's killed...
while true; do
    output=$(/usr/local/bin/logtail $file .${offset}.offset)
    if [ ! -z "$output" ]; then

        # print the output and say ding
        echo "$output" && say ding
        # to have the file read aloud to you, uncomment the following:
        say "$output"

        fi
    # recheck every 5 seconds
    sleep 5
done

Gracias @Tim, screenmuestra y alerta (supongo que también puedo hacer que suene la campana) SOLO UNA VEZ. No por cada nuevo evento que sucede (no por cada nueva línea que está disponible)
Ali

1
Agregué un ejemplo para Mac que podría leer el archivo. puede cambiarlo para que funcione para Linux instalando la versión de Linux de logtail y utilizando el beepcomando, en lugar de say.
Tim Kennedy el

¡guay! Eso es creativo, aunque en mi caso estoy usando el pitido para poder monitorear un archivo de registro sin mirar la pantalla. Y el pitido real puede ser mejor que una voz.
Ali

1
También puede usar el execcomando de pantalla para hacerlo también. El ejemplo en la página de manual es el !:sed -n s/.*Error.*/\007/pque enviará una campana cada vez que se muestre "Error" en esa ventana.
Arcege

Lo mismo se aplica a Tmux.
0xC0000022L

10

Podrías usar multitail . Es una cola mejorada que admite la ejecución de comandos en la coincidencia de expresiones regulares.

Por ejemplo, el siguiente comando reproduce un sonido y abre una ventana xmessage cada vez que se registra un paquete fuente marciano .

multitail -ex "martian source" "play beep.wav; xmessage " -i /var/log/messages

4

Solo para el registro, como @Nils sugirió que estoy usando sedpara agregar un bella cada línea.

La sedlínea proporcionada por @Gilles

sed -e $'s/$/\a/' 

funciona en mi mac (habilité "timbre audible" y "timbre visual" en mi Terminal \ preferencias \ avanzado).


Es de destacar que las $'...'secuencias de escape son una cosa solo de Bash.
anfetamáquinas

@amphetamachine gracias, aunque yo también soy un usuario bash, sería bueno que usted u otros puedan agregar versiones que también funcionen en otros shells.
Ali

También soy un usuario bash, pero poco a poco estoy aprendiendo qué funcionará y qué no funcionará en otros shells.
anfetamáquinas

1

Para cualquier otra persona que encuentre esta página, estoy usando tcsh y esto parece funcionar:

tail -f changingfile | sed -e 's/.*/& \a/'

No me preguntes qué significa la sintaxis sed ...


1
No puedo evitarlo, debo preguntar, ¿puedes explicar la expresión sed?
Ashwani Agarwal

0

Puede probar konsolecuál permite la alerta sobre nueva actividad (o silencio) en cualquier pestaña.


Me imagino konsoleque sería como screenalertar una vez, mientras que necesito recibir una alerta para cada nueva línea.
Ali
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.