如何在tail -f事件时发出提示音


14

我希望我的电脑在每次尾声时发出系统提示音

我有以下命令

tail -f development.log | grep "something rare"

有没有简单的方法像将其通过管道传送到发出哔哔声一样?喜欢

tail -f development.log | grep "something rare" | beep

如果是这样,是否还会显示grep输出?


在debian和变体的默认存储库中有一个哔声程序,只是apt-get install beep,但它不适用于这种方式
Jakob Cosoroaba 09年

Answers:


16

只需定义beep如下:

beep() { read a || exit; printf "$a\007\n"; beep; }

然后,您可以使用以下命令:

tail -f development.log | grep "something rare" | beep

1
抱歉,这不起作用,它不会发出哔声或打印任何内容
Jakob Cosoroaba 09年

4
尽管tail -f的直接输出是立即的,但它在通过管道后会立即得到缓冲。在观察任何东西之前,您必须等待足够的“稀有事物”。
mouviciel

您可以将输出通过sed或类似的方法(在tail和grep之间)传递给regexp,并将其something rare自身替换很多次。需要执行多少次取决于缓冲的管道数量。
David Spillett

6
@David-那是一个碰碰运气的方法。如果要

2
脱离@nagul的建议,以下是对我tail -f development.log | stdbuf -oL -eL grep "something rare" | beep
有用

10

GNU屏幕具有内置功能,可在给定窗口更改时发出提示音:请参见手册页的相关部分

标题摘要:

$ screen
$ tail -f yourfile.log    # inside the screen session
<C-a> M    # "Window 0 (bash) is now being monitored for all activity."

正如评论中指出的那样,这将在每个新的日志条目上发出蜂鸣声,而不仅仅是那些与“稀有”匹配的条目,因此这并不能完全满足OP的要求。仍然是了解恕我直言的有用技巧。

您可以通过打开两个screen窗口(<C-a> c打开一个窗口,<C-a> <C-a>在两个窗口之间切换)来获得两全其美的效果:

  1. 受监控,具有 tail -f yourfile.log | grep 'something rare'
  2. 不受监视,朴素 tail -f yourfile.log

然后,您可以坐在窗口2中观看日志滚动,当发生“罕见事件”时,您将从窗口1发出蜂鸣声。

screen 非常强大-我强烈建议您阅读它。


1
那不会只对“稀有事物”发出哔哔声,对吗?

1
如果不是在那个特定窗口中发生的一切,tail -f yourfile.log | grep something\ rare而仅仅是tail -f logfile
David Spillett

糟糕,我没有注意到他只想发出哔哔声something rare。编辑以反映这一点。grep可以工作,但随后他将看不到日志的其余部分,只有稀有的行-据我了解,他希望能够看到整个日志滚动过去,但在发生特定事件时得到警告。
山姆·斯托克斯

1

您可以停止在grep命令中缓冲输出。有关详细信息,请参见man grep。

您可以将grep输出输出到哔声。

以下示例来自“哔哔”。

   As part of a log-watching pipeline

          tail -f /var/log/xferlog | grep --line-buffered passwd | \
          beep -f 1000 -r 5 -s

这些手册中有很多好东西。如果只需要我们不必阅读即可找到它。;-)


1

watch命令具有--beep选项,您也可以设置轮询间隔,但是2秒的标准时间就可以了

watch --beep 'tail development.log | grep "something rare"'

1
注意,watch通过在每个(间隔)节中运行参数/命令,然后将结果返回到上一次运行来工作。因此,您将要使用tail命令的普通版本,而不是使用tail -f
RyanWilcox

这对我不起作用(尽管添加watch --beep并包装了我的尾巴/ grep,但仍然没有发出哔声)。
machineghost

1

您可以使用sed来添加control-G,如下所示:

tail -f myFile | sed "s/.*/&\x07/"

或仅在很少的行上,而不使用grep,如下所示:

tail -f myFile | sed -n "/something rare/s/.*/&\x07/p"

它说:在哪里罕见的事情发生了线,ş ubstitute家居与控制-G同样的东西在月底上涨,并打印(但不打印不匹配的行)。很棒!


0

嗯,棘手。我们也许可以做这样的事情?

for i in `find | grep 7171`; do beep; echo $i; done

还是你的情况

for i in `tail -f development.log | grep "something rare"`; do beep; echo $i; done

它似乎正在做一些缓冲。我将看看是否有一种方法可以通过for循环关闭此缓冲。

显然,您应该能够通过使用来调整管道的缓冲,ulimit -p但这一直使我抱怨Invalid参数。我还发现了一个帖子,声称您需要重新编译内核才能更改此限制。


0

在上一份工作中,仅凭命令功能我无法获得可靠的观察程序,因此我有一个包装脚本,如下所示,该脚本在每个poll_duration中检查文件秒并用新行感兴趣的短语。

#!/bin/bash

file=$1
phrase=$2
poll_duration=$3

typeset -i checked_linecount
typeset -i new_linecount
typeset -i new_lines
let checked_linecount=new_linecount=new_lines=0
echo "Watching file $file for phrase \"$phrase\" every $poll_duration seconds"

while [ 1 ]
do
        let new_linecount=`wc -l $file| awk '{print $1}'`
        if [[ $new_linecount > $checked_linecount ]]; then
                let "new_lines = $new_linecount-$checked_linecount"
                head --lines=$new_linecount "$file" | tail --lines=$new_lines | grep "$phrase" && beep
                let checked_linecount=$new_linecount
        fi
        sleep $poll_duration
done

这是在Unix机器上。在Linux上,您可以使用其inotify filewatcher界面来做得更好。如果此软件包(inotify-tools在Ubuntu上为),请更换

sleep $poll_duration 

inotifywait -e modify "$file"  1>/dev/null 2>&1

该调用将一直阻塞,直到文件被修改。屏蔽版本几乎与您获得的版本一样高效tail -f如果可以将管道配置为在不进行缓冲的情况下运行,则版本相同。

注意:该脚本首先执行a,head --lines=$new_linecount以确保在我们检查文件后添加到文件中的行不会歪曲在此循环中检查的文件块。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.