我想读取日志并根据程序的运行情况做出一些决定。我的脚本基于此ffmpeg
,我正在重定向stdout
以生成日志。然后我正在读取日志以做出决定。我的功能是:
YT-PACTIONS()
{
tail -f $MSSLOGS/$project-$intnumber/$project-$intnumber-cache.log | awk '/speed/ { speed=$10 ; print speed ; }'
}
这不起作用。它speed
用$1
而不是 来填充 var $10
。我试过了${10}
,也没用。
如果我在 shellscript 中发送命令,它就会起作用:
tail -f $MSSLOGS/$project-$intnumber/$project-$intnumber-cache.log | awk '/speed/ { speed=$10 ; print speed ; }'
但是我这里也遇到了问题。它向我显示了结果:
speed=1.01
speed=1.01
speed=1.03
speed=1.02
speed=1.01
speed=1.04
但我只想以以下方式查看数字:
1.01
1.04
1.03
1.02
1.01
所以我有两个错误:$10
第一个错误,然后是只在变量中保存数字。
样本日志:
CloneNew PasteExpire in 23 h
frame= 279 fps=257 q=30.0 size=N/A time=00:00:05.76 bitrate=N/A dup=111 drop=0 speed=5.3x
frame= 344 fps=214 q=30.0 size=N/A time=00:00:07.06 bitrate=N/A dup=137 drop=0 speed=4.39x
frame= 419 fps=198 q=29.0 size=N/A time=00:00:08.57 bitrate=N/A dup=167 drop=0 speed=4.06x
frame= 526 fps=201 q=29.0 size=N/A time=00:00:10.70 bitrate=N/A dup=210 drop=0 speed=4.09x
frame= 741 fps=116 q=28.0 size=N/A time=00:00:15.04 bitrate=N/A dup=296 drop=0 speed=2.36x
frame= 848 fps=123 q=32.0 size=N/A time=00:00:17.13 bitrate=N/A dup=339 drop=0 speed=2.49x
frame= 1084 fps=147 q=31.0 size=N/A time=00:00:21.86 bitrate=N/A dup=433 drop=0 speed=2.97x
有人可以帮忙吗?
答案1
您可以使用这个 GNU awk 脚本:
awk -v RS='[ \n]' -F'=' '/speed/{print $2+0}' file
记录分隔符RS
并FS
设置为匹配key=value
字符串。
speed
然后匹配字符串并打印其关联值。注意+0
删除x
数字末尾的 。
答案2
awk
您可以使用 GNU的函数选择所需列的子字符串substr
:
awk '/speed/ {print substr($10, 7)+0}' file
或者
awk '/speed/ {print substr($10, 7, length($10)-7)}' file
语法substr
是:
substr(string, start [, length ])
上述两个命令是等效的:
首先,我们添加
0
到子字符串中以摆脱x
(在awk
以数字开头的字符串中添加数字时只保留数字部分)。在第二个中,我们选择子字符串的长度比长度小一个字符
$10
(这是因为我们从第 7 个字符开始切片,length($10)-7
而不是)。length($10)-1
输出为:
5.3
4.39
4.06
4.09
2.36
2.49
2.97