0

编辑 - 在 4 月 7 日稍微改写了这个问题,以使其更清楚。

当前的工作环境是 OSX 10.4.11。

我想扫描日志文件中的某个短语。不能在脚本开始时清空日志文件。因此,脚本必须只扫描对日志的更改。

我当前的脚本:

#!/bin/sh
  tail -f log.txt | while read line 
do
  if echo $line | grep -q 'LOL CANDY'; then
    echo 'LOL MATCH FOUND'
    exit 0
  fi
done

它可以正常工作,因为它会在找到“LOL CANDY”后立即“找到LOL MATCH FOUND”,但它不会真正退出脚本,直到在“LOL CANDY”之后的日志中添加了一些其他内容。我需要它立即退出。尽管我不确定它是否具体相关,但存在“tail -f”永远保持打开状态的问题。有人可以给我一个不使用tail -f的例子吗?

如果你愿意,你可以给我一个 bash 脚本,因为 OSX 可以处理 sh、bash 和我认为的其他一些 shell。

4

6 回答 6

2

第二次启动脚本时是否清除了 log.txt?您可能会解释说您的戒烟线需要出现两次,而实际上只需要一次。因为您使用的是 -f,所以它只会列出您启动脚本后添加的所有内容。

因此,当您第一次尾随它时,您会得到想要的线路并退出。您重新启动脚本,它将忽略第一个实例,因为它不会被输入到您的 -f 参数中。但是,下一次发生应该退出。如果你查看你的日志,你会看到两条 LOL CANDY 行,因为你只是跟随尾巴而不是查看日志中已经存在的内容。

如果您希望脚本在该行出现在日志中时终止,您可以将其添加到脚本的开头。

 #!/bin/sh
  if grep 'LOL CANDY' log.txt; then
   echo 'LOL MATCH FOUND'
   exit 0
  fi

  tail -f log.txt | while read line 
do
  if echo $line | grep -q 'LOL CANDY'; then
    echo 'LOL MATCH FOUND'
    exit 0
  fi
done

此外,如果您想摆脱 tail -f 您可以在无限循环中执行我在第一个实例中列出的内容(语法可能是错误的,已经有一段时间了):

#!/bin/sh
while (1)
do
  if grep 'LOL CANDY' log.txt; then
   echo 'LOL MATCH FOUND'
   exit 0
  fi
done

当然,如果您的日志文件变得非常大,那么这将占用大量资源并花费大量时间。

于 2010-04-06T20:32:20.410 回答
1

也许这个脚本会帮助你:

#!/bin/bash

FILE=/tmp/mytest
PIPE=/tmp/myfifo

if [[ ! -p $PIPE ]];
then
        mkfifo $PIPE
fi

tail -n 0 -f $FILE >> $PIPE &
TAILPID=$!

while read line < $PIPE
do
        echo "Received: $line"
        if [ "x$(echo "$line" | grep -l -P "asdf")" != "x" ];
        then
                echo "MATCHES"
                kill -TERM $TAILPID
        fi
done;
于 2012-04-27T17:00:46.443 回答
0

尝试这个

(tail -f  file| awk '/interesting/{print;exit}')
于 2010-04-07T02:49:22.067 回答
0

我不太确定我是否理解你的问题。无论如何,我试过你的脚本,它在第一次运行时没有退出。那么,如何添加:

pid=`ps -ef | grep "tail -f log.txt" | grep -v grep | awk '{print $2}'`
kill -2 $pid

之前exit 0这样的tail -f出口?

于 2010-04-07T02:54:49.250 回答
0
tail -f log.txt | sed -n '/interesting/{
p
q
}'

基本上,读取行而不打印任何内容;当你看到有趣的东西时,打印该行并退出。

哦,我知道你不想要'tail -f';这很奇怪,它应该在下一次需要写入管道时退出。如果它不再写入管道,那可能是个问题。

我想你可以这样做:

tail -f log.txt | sed -n '/interesting/{
p
q
}'
echo "EOF" >> log.txt

这给了它一些回应,所以它尝试并失败并终止。

于 2010-04-06T20:05:20.733 回答
0

我一直在寻找这个,并想出了以下作品(无论如何对于我的应用程序):

tail -n 1 -f /var/log/vmkernel.log | grep -m 1 IOMMUIntel >>/var/log/vmkernel.log

跟踪日志,grep找到文本,然后grep将文本写回日志,这会杀死tail并返回提示。

具体来说,它会测试当 VM 在 VMware ESXi 上启动时通过的显卡何时变为活动状态。

完整的项目在这里

于 2015-02-21T03:07:40.383 回答