PHP尾部-n 1的奇怪性返回多个结果

wax*_*cal 2 php file tail

我有这个问题......回答非常好,它也是.但是,奇怪的是,如果日志文件有一个唯一的最后一行(即前几行与前一行不同),它会正确返回最后一行,tail -n 1 "file"但如果最后几行与最后一行相似,它返回所有相似的行.

让我演示给你看....

它正在阅读的文件是......

frame= 1065 fps= 30 q=1.6 size=   11977kB time=35.54 bitrate=2761.1kbits/s    
frame= 1081 fps= 30 q=2.7 size=   12174kB time=36.07 bitrate=2765.0kbits/s    
frame= 1097 fps= 30 q=2.7 size=   12332kB time=36.60 bitrate=2759.9kbits/s    
frame= 1113 fps= 30 q=3.0 size=   12487kB time=37.14 bitrate=2754.4kbits/s    
frame= 1129 fps= 30 q=2.4 size=   12652kB time=37.67 bitrate=2751.3kbits/s    
frame= 1145 fps= 30 q=2.4 size=   12824kB time=38.20 bitrate=2749.7kbits/s    
frame= 1161 fps= 30 q=2.4 size=   12996kB time=38.74 bitrate=2748.1kbits/s    
frame= 1176 fps= 30 q=2.7 size=   13162kB time=39.24 bitrate=2747.8kbits/s    
frame= 1191 fps= 30 q=2.6 size=   13328kB time=39.74 bitrate=2747.4kbits/s    
frame= 1206 fps= 30 q=2.5 size=   13496kB time=40.24 bitrate=2747.5kbits/s    
frame= 1222 fps= 30 q=2.5 size=   13685kB time=40.77 bitrate=2749.6kbits/s    
frame= 1240 fps= 30 q=4.2 size=   13954kB time=41.38 bitrate=2762.8kbits/s    
frame= 1261 fps= 31 q=4.6 Lsize=   14428kB time=42.08 bitrate=2809.1kbits/s    
video:13889kB audio:494kB global headers:0kB muxing overhead 0.314239%

$line = `tail -n 1 "$logfile"`;
Run Code Online (Sandbox Code Playgroud)

退货...

video:13889kB audio:494kB global headers:0kB muxing overhead 0.314239%
Run Code Online (Sandbox Code Playgroud)

但是,如果那个最后,更独特的线,不存在......它返回: -

frame= 1065 fps= 30 q=1.6 size=   11977kB time=35.54 bitrate=2761.1kbits/s    
frame= 1081 fps= 30 q=2.7 size=   12174kB time=36.07 bitrate=2765.0kbits/s    
frame= 1097 fps= 30 q=2.7 size=   12332kB time=36.60 bitrate=2759.9kbits/s    
frame= 1113 fps= 30 q=3.0 size=   12487kB time=37.14 bitrate=2754.4kbits/s    
frame= 1129 fps= 30 q=2.4 size=   12652kB time=37.67 bitrate=2751.3kbits/s    
frame= 1145 fps= 30 q=2.4 size=   12824kB time=38.20 bitrate=2749.7kbits/s    
frame= 1161 fps= 30 q=2.4 size=   12996kB time=38.74 bitrate=2748.1kbits/s    
frame= 1176 fps= 30 q=2.7 size=   13162kB time=39.24 bitrate=2747.8kbits/s    
frame= 1191 fps= 30 q=2.6 size=   13328kB time=39.74 bitrate=2747.4kbits/s    
frame= 1206 fps= 30 q=2.5 size=   13496kB time=40.24 bitrate=2747.5kbits/s    
frame= 1222 fps= 30 q=2.5 size=   13685kB time=40.77 bitrate=2749.6kbits/s    
frame= 1240 fps= 30 q=4.2 size=   13954kB time=41.38 bitrate=2762.8kbits/s    
frame= 1261 fps= 31 q=4.6 Lsize=   14428kB time=42.08 bitrate=2809.1kbits/s
Run Code Online (Sandbox Code Playgroud)

bal*_*pha 7

这些行由"\ r"分隔,即回车符,而不是换行符,因为ffmpeg(你正在使用的,对吧?)想要在控制台的同一行显示它们.然而,Tail期望"\n"作为线路分离器.

总结下面的小评论聊天:打电话

$line = `sed -e "s/\\r/\\n/g" $file | tail -n 1`
Run Code Online (Sandbox Code Playgroud)

在调用tail之前将通过换行替换回车符,从而给出预期的结果.

  • 优点.出于解释原因...在基于旧线路的系统上,\ r用于重置水平位置,而\n用于垂直向下移动一条线.因此,\ r \n将光标移动到下一行的开头.从那时起,大多数*NIX系统已经转移到简单的\n但是\ r仍然具有它的含义. (2认同)

aks*_*aks 5

你可以用十六进制编辑器打开文件,并检查哪个字符用作"框架"线之间的分隔符.我认为帧线之间可能还有一些换行符,这就是为什么'tail'返回整个块而不是最后一行(在这种情况下恰好是整个帧块)的原因.

用换行符替换回车符

$line = `sed 's|\\r|\\n|g' "$logfile"| tail -n 1`;
Run Code Online (Sandbox Code Playgroud)

确保在传递给sed的正则表达式的末尾包含全局开关('g'),如上所示.