我正在尝试获取文件的最后一行。 文件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相撞而另一个“ - ”不存在。
这种奇怪行为有什么解释?
答案 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`;
第一个稍微准确一点,但第二个更快。