Answers:
只需定义beep
如下:
beep() { read a || exit; printf "$a\007\n"; beep; }
然后,您可以使用以下命令:
tail -f development.log | grep "something rare" | beep
sed
或类似的方法(在tail和grep之间)传递给regexp,并将其something rare
自身替换很多次。需要执行多少次取决于缓冲的管道数量。
tail -f development.log | stdbuf -oL -eL grep "something rare" | beep
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>
在两个窗口之间切换)来获得两全其美的效果:
tail -f yourfile.log | grep 'something rare'
tail -f yourfile.log
然后,您可以坐在窗口2中观看日志滚动,当发生“罕见事件”时,您将从窗口1发出蜂鸣声。
screen
非常强大-我强烈建议您阅读它。
tail -f yourfile.log | grep something\ rare
而仅仅是tail -f logfile
something rare
。编辑以反映这一点。grep可以工作,但随后他将看不到日志的其余部分,只有稀有的行-据我了解,他希望能够看到整个日志滚动过去,但在发生特定事件时得到警告。
watch命令具有--beep选项,您也可以设置轮询间隔,但是2秒的标准时间就可以了
watch --beep 'tail development.log | grep "something rare"'
watch
通过在每个(间隔)节中运行参数/命令,然后将结果返回到上一次运行来工作。因此,您将要使用tail命令的普通版本,而不是使用tail -f
watch --beep
并包装了我的尾巴/ grep,但仍然没有发出哔声)。
嗯,棘手。我们也许可以做这样的事情?
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参数。我还发现了一个帖子,声称您需要重新编译内核才能更改此限制。
在上一份工作中,仅凭命令功能我无法获得可靠的观察程序,因此我有一个包装脚本,如下所示,该脚本在每个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
以确保在我们检查文件后添加到文件中的行不会歪曲在此循环中检查的文件块。