【问题标题】:Linux file craziness - strange behaviour getting last line of log fileLinux文件疯狂-获取日志文件最后一行的奇怪行为
【发布时间】:2009-08-06 17:59:14
【问题描述】:

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

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

我试过了

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

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

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

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

帧= XX fps= X​​X q=XX 尺寸= XX 时间=XX比特率=XXkbits/s

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

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

echo "--$last_line--";

当我运行它时,输出是几秒钟,只是数字增加的日志行。当它到达终点时,输出是

--ame= 7119 fps= 9 q=13.8 大小= 4809kB 时间=474.50 比特率= 83.0kbits/s

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

这种奇怪行为的解释是什么?


【问题讨论】:

  • 尝试使用 echo "--".$line。 "--\n";也

标签: php linux shell


【解决方案1】:

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

试试

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

你可能还想做类似的事情

var_dump($lastline); die();

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

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

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

尝试使用 he 命令

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

获取日志的最后一行。

【讨论】:

  • 那行不通。正如你所建议的,我添加了 var_dump 但它也做了同样的事情。请看我添加的视频截图。
  • 非常感谢,新命令运行良好。我不认为 \r 冷导致了这一点。学习新东西。
【解决方案2】:

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

如果文件的增长速度不是很快,那很好。当文件快速增长时,您会返回多行。

尝试以下任何一种:

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

第一个更准确,但第二个更快。

【讨论】:

  • 谢谢,但这并没有帮助。我会尽量截图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2019-03-16
  • 1970-01-01
  • 2021-06-20
相关资源
最近更新 更多