Странность с хвостом PHP -n 1, возвращающая несколько результатов

У меня был этот вопрос … ответил и очень хорошо, что это было слишком. Но возникла странность: если файл журнала имеет уникальную последнюю строку (т.е. первые несколько слов отличаются от предыдущих строк), он правильно возвращает эту последнюю строку с 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"`; 

ВОЗВРАТ …

 video:13889kB audio:494kB global headers:0kB muxing overhead 0.314239% 

Однако , если эта последняя, ​​более уникальная строка, не существует … она возвращает: –

 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 

Solutions Collecting From Web of "Странность с хвостом PHP -n 1, возвращающая несколько результатов"

Не могли бы вы открыть файл с помощью шестнадцатеричного редактора и проверить, какой символ используется в качестве разделителя между строками «frame». Я думаю, что может быть что-то другое, кроме символа новой строки между строками фрейма, поэтому «хвост» возвращает весь блок, а не только последнюю строку (которая в этом случае является целым блоком кадра).

Замените возврат каретки на новую строку так, чтобы

 $line = `sed 's|\\r|\\n|g' "$logfile"| tail -n 1`; 

Убедитесь, что вы включили глобальный переключатель ('g') в конец регулярного выражения, переданного в sed, как показано выше.

Эти строки разделяются символом «\ r», т. Е. Возврат каретки, а не строка, потому что ffmpeg (это то, что вы используете, правильно?) Хочет показать их в одной строке консоли. Хвост, однако, ожидает «\ n» в качестве разделителя строк.

Подведем итог нашему маленькому комментарию ниже: Calling

 $line = `sed -e "s/\\r/\\n/g" $file | tail -n 1` 

заменит возврат каретки линейными каналами перед вызовом хвоста, что даст ожидаемые результаты.