Странность с PHP-хвостом -n 1, возвращающим несколько результатов - PullRequest
2 голосов
/ 30 июня 2009

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

Ответы [ 2 ]

7 голосов
/ 30 июня 2009

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

Чтобы подвести итог нашего небольшого комментария чата ниже: Звонок

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

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

5 голосов
/ 30 июня 2009

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

Заменить возврат каретки новой строкой как

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

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

...