Shell 覆盖匹配线

Shell 覆盖匹配线,shell,awk,ffmpeg,Shell,Awk,Ffmpeg,当我将ffmpeg的输出打印到文件时,我得到如下结果: [...] frame= 28 fps=0.0 q=-0.0 size=N/A time=00:00:01.16 bitrate=N/A speed=2.31x frame= 55 fps= 54 q=-0.0 size=N/A time=00:00:02.24 bitrate=N/A speed= 2.2x frame= 84 fps= 55 q=-0.0 size=N/A time=00:00:03.40 b

当我将ffmpeg的输出打印到文件时,我得到如下结果:

[...]
frame=   28 fps=0.0 q=-0.0 size=N/A time=00:00:01.16 bitrate=N/A speed=2.31x    
frame=   55 fps= 54 q=-0.0 size=N/A time=00:00:02.24 bitrate=N/A speed= 2.2x    
frame=   84 fps= 55 q=-0.0 size=N/A time=00:00:03.40 bitrate=N/A speed=2.22x    
frame=  112 fps= 54 q=-0.0 size=N/A time=00:00:04.52 bitrate=N/A speed=2.17x    
[...]
awk '/frame=/ { close("file"); print > "file" }'
现在,我希望所有与
frame=*
匹配的行都被替换,并且只有最后一行被打印到文本文件中(实时)

这可能吗

目前我有以下几行:

ffmpeg-v info-i input.ext-f null 2>&1 | awk'/frame=/{gsub(/.*/,$0)};{print}'


它几乎可以工作,除了包含
frame=*
的所有行都是空的。

您可以使用此筛选器:

awk '/frame=/{f=$0; next}END{print f}'

它将最新匹配的
frame=
保存在
f
中,而不打印它,并在脚本末尾打印保存的值。

您可以从awk中截断文件,并每行写入一次,如下所示:

[...]
frame=   28 fps=0.0 q=-0.0 size=N/A time=00:00:01.16 bitrate=N/A speed=2.31x    
frame=   55 fps= 54 q=-0.0 size=N/A time=00:00:02.24 bitrate=N/A speed= 2.2x    
frame=   84 fps= 55 q=-0.0 size=N/A time=00:00:03.40 bitrate=N/A speed=2.22x    
frame=  112 fps= 54 q=-0.0 size=N/A time=00:00:04.52 bitrate=N/A speed=2.17x    
[...]
awk '/frame=/ { close("file"); print > "file" }'

在awk中使用
时,它会在写入文件之前打开并截断文件。将追加对同一文件的后续写入。如果每次都关闭该文件,那么下次写入时它将始终截断该文件。

谢谢你,Michael,问题是,当ffmpeg完成该过程时,我会得到结果。但是在ffmpeg运行时,我已经需要输出,所以我可以实时捕获日志文件。