2

私はこの質問をしました...答えて、それもとても良かったです。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
4

2 に答える 2

7

これらの行は「\r」で区切られます。つまり、ffmpeg(これはあなたが使用しているものですよね?)がコンソールの同じ行に表示したいので、改行ではなくキャリッジリターンです。ただし、テールは「\n」をラインセパレータとして想定しています。

以下の小さなコメントチャットを要約すると:

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

テールを呼び出す前に、キャリッジリターンをラインフィードに置き換えて、期待どおりの結果を提供します。

于 2009-06-30T10:27:43.353 に答える
5

16進エディタでファイルを開き、「フレーム」行の間の区切り文字として使用されている文字を確認してください。フレーム行の間に改行文字以外のものがある可能性があると思います。そのため、「tail」は最後の行だけでなくブロック全体を返します(この場合はフレームブロック全体です)。

キャリッジリターンを改行に置き換えます。

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

上記のように、sedに渡される正規表現の最後にグローバルスイッチ(「g」)が含まれていることを確認してください。

于 2009-06-30T10:27:54.553 に答える