AWK函数过滤日志

AWK函数过滤日志

我想读取日志并根据程序的运行情况做出一些决定。我的脚本基于此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

记录分隔符RSFS设置为匹配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

相关内容