Есть ли способ сделать хвостовой сигнал?

23

Есть ли способ сделать tail -Fили подать lessзвуковой сигнал (позвонить в терминал), когда приходят новые данные (новая строка добавляется в файл). Или есть какая-либо другая утилита Unix, чтобы сделать это на Linux или Mac.

Али
источник

Ответы:

13

Идея состоит в том, чтобы передать вывод tailчерез sedи заменить символ новой строки колоколом / символом новой строки.

Но, вероятно, есть более простое решение, если вы используете tailв X-Window . Там вы можете выполнить действие при изменении содержимого окна (мерцание, звонок, что угодно).

Nils
источник
4
Не заменяйте символ новой строки, добавьте его в конце строки.
Кевин
@ Nils, эта sedидея блестящая, но я не знаю достаточно «sed», чтобы заставить ее работать, похоже, я не могу перехватить переводы строк в регулярном выражении обычным способом (к которому я привык), думаю, мне нужно сказать sed не интерпретируйте входящий поток построчно.
Али
5
@Ali Действительно, sed действует построчно, и вы не видите прямые строки. sed -e $'s/$/\a/'добавляет $'\a'(символ колокола в синтаксисе ksh / bash / zsh) в конце каждой строки.
Жиль "ТАК - перестать быть злым"
Спасибо @Gilles, работал как шарм (на Mac тоже)! sedРегулярное выражение немного странно для моих наивных глаз.
Али
1
@ Жиль: Обратите внимание, что $'...'синтаксис не универсален. Например, [t] csh не поддерживает это.
Кит Томпсон
13

если вы используете GNU screen, вы можете настроить его на «наблюдение» за окном с хвостом, и оно сообщит вам в строке состояния или по колоколу, определенному вашим termcap, о появлении нового вывода в этом окне.

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


редактировать: просто нужно было добавить это, так как вы упомянули Mac OS X

просто для удовольствия, если вы искали что-то конкретное, вы можете использовать sayкоманду Mac OS X, чтобы прочитать вам файл, который вы смотрите. просто получите logtailкоманду от:

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

И использовать его в сценарии, как:

#!/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
Тим Кеннеди
источник
Спасибо @Tim, screenпоказывает и предупреждает (я думаю, что я могу сделать это также и звонок) ТОЛЬКО ОДИН РАЗ. Не для каждого нового события, которое происходит (не для каждой новой доступной строки)
Али
1
Я добавил пример для Mac, который может прочитать файл для вас. Вы можете изменить это, чтобы работать для linux, установив версию lintail для linux и используя beepкоманду вместо say.
Тим Кеннеди
прохладный! Это креативно, хотя в моем случае я использую звуковой сигнал, чтобы иметь возможность контролировать файл журнала, не глядя на экран. И настоящий звуковой сигнал может быть лучше, чем голос.
Али
1
Можно также использовать execкоманду экрана, чтобы сделать это. Пример на странице руководства - это то, !:sed -n s/.*Error.*/\007/pчто будет отправлять звонок каждый раз, когда в этом окне отображается «Ошибка».
Arcege
То же самое относится и к Tmux.
0xC0000022L
10

Вы можете использовать мультитейл . Это расширенный хвост, который поддерживает выполнение команд при сопоставлении регулярных выражений.

Например, следующая команда воспроизводит звук и открывает окно xmessage каждый раз, когда марсианский исходный пакет регистрируется.

multitail -ex "martian source" "play beep.wav; xmessage " -i /var/log/messages
andcoz
источник
4

Просто для записи, как @Nils предложил, я использую, sedчтобы добавить bellк каждой строке.

sedЛинии обеспечивается @Gilles

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

работает на моем Mac (я включил «звуковой звонок» и «визуальный звонок» в моем терминале \ предпочтения \ расширенный).

Али
источник
Следует отметить, что $'...'escape-последовательности предназначены только для Bash.
амфетамина
@amphetamachine спасибо, хотя я сам являюсь пользователем bash, было бы неплохо, если бы вы или другие пользователи могли добавлять версии, которые будут работать и на других оболочках.
Али
Я также пользователь bash, но я постепенно изучаю, что будет и не будет работать в других оболочках.
амфетамина
1

Для тех, кто находит эту страницу, я использую tcsh, и это работает:

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

Не спрашивайте меня, что означает синтаксис sed ...

Раймонд
источник
1
Я не могу с собой поделать, я должен спросить, вы можете объяснить выражение sed?
Ашвани Агарвал
0

Вы можете попробовать, konsoleкоторый позволяет оповещение о новой активности (или молчание) в любой вкладке.

Аарон Д. Мараско
источник
Я предполагаю, konsoleчто это будет похоже на screenпредупреждение один раз, в то время как мне нужно получать предупреждение для каждой новой строки.
Али