Shell 覆盖匹配线
当我将ffmpeg的输出打印到文件时,我得到如下结果: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
[...]
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运行时,我已经需要输出,所以我可以实时捕获日志文件。