Linux文件疯狂 - 获取最后一行日志文件的奇怪行为

时间:2009-08-06 17:59:15

标签: php linux shell

我正在尝试获取文件的最后一行。 文件ff.log在ffmpeg工作时每秒获取新数据。 日志文件如下所示:

  

frame = 20 fps = 0 q = 7.7 size = 40kB time = 1.24 bitrate = 266.1kbits / s
  frame = 30 fps = 28 q = 6.6 size = 51kB time = 1.90 bitrate = 218.4kbits / s
  frame = 40 fps = 24 q = 6.6 size = 61kB time = 2.60 bitrate = 191.4kbits / s
  frame = 47 fps = 20 q = 6.8 size = 65kB time = 3.08 bitrate = 173.8kbits / s
  frame = 64 fps = 22 q = 7.0 size = 84kB time = 4.20 bitrate = 163.8kbits / s
  (不断每秒或更快地添加新行)

我试过了

$line = `tail -n 1 $file`;

我尝试使用带有“php tail script”的fseek()。

两者都导致了一些奇怪的行为。

我从命令行运行了我的脚本并输出:

  

frame = XX fps = XX q = XX size = XX   time = XX bitrate = XXkbits / s

XX持续增加几秒钟直到它是最后一行的值。

现在,在我的PHP脚本中,我有

echo "--$last_line--";

当我运行它时,输出几秒钟,只是日志行数量增加。当它到达结尾时,输出

  

- ame = 7119 fps = 9 q = 13.8 size = 4809kB time = 474.50 bitrate = 83.0kbits / s

请注意,第一个“ - ”与$ last_line相撞而另一个“ - ”不存在。

这种奇怪行为有什么解释?


2 个答案:

答案 0 :(得分:3)

这可能是因为它认为你要求它打印“$ lastline--”......

尝试

echo '--' . $lastline . '--';

您可能还想做类似

的事情
var_dump($lastline); die();

要准确显示变量中的内容,因为这会为您提供更多信息。

但是,我建议您发布整个脚本,以便有人可以尝试查看问题所在。

编辑查看该文件,它似乎只使用\ r \ n作为行终止符。这会导致您看到的问题(这意味着“返回到行的开头”) - 这意味着所有日志都显示为最后一行。

尝试使用他的命令

cat ff.log | tr "\r" "\n" | tail -n 2 | head -n 1

获取日志的最后一行。

答案 1 :(得分:0)

tail命令和PHP脚本都有同样的问题。 他们寻找文件的末尾,回到前一行的结尾,然后从那里读取并打印所有内容到文件的末尾。

如果文件没有快速增长,那就没问题了。当文件快速增长时,会返回多行。

尝试其中任何一种:

$line = `tail -n 1 $file | tail -n 1`;
$line = `tail -n 1 $file | head`;

第一个稍微准确一点,但第二个更快。