bash脚本从大型日志文件中提取数据

问题描述 投票:0回答:3

我相信你很好!

我正在使用FreeBSD(在Citrix NetScaler上……)我面临的挑战是从实际上有100几千行的日志中提取Mbps。

日志看起来像这样,其中带小数的Mbps数字范围可以从0.0到9999.99或更大。即

#>alphatext_anylength... (more_alphatext_in brackets)... Mbps (1.0)… alphatext_anylength... (more_alphatext_in brackets)... 
#>alphatext_anylength... (more_alphatext_in brackets)... Mbps (500.15)… alphatext_anylength... (more_alphatext_in brackets)... 
#>alphatext_anylength... (more_alphatext_in brackets)... Mbps (1500.01)… alphatext_anylength... (more_alphatext_in brackets)... 

现在的挑战是,我要过滤掉所有Mbps括号内的数字,其小数位数A)大于500mbps,B)行号。也就是说,对于上面的示例输出,我只想查看以下内容:

#>[line number 20] 500.15
#>[line number 55] 1500.01

我尝试过:

cat output.log | sed -n -e 's/^.*Mbps//p' |cut -c 3-10

哪个会在Mbps后给我10个字符。但这还不够聪明,无法仅显示大于500Mbps的带括号的十进制数字。

如果遇到挑战,我可能会有点感激……但是,对于任何可以创建魔术的bash脚本向导,我们将不胜感激!

提前感谢!

bash sed freebsd netscaler
3个回答
0
投票

您可以使用awk来匹配包含Match (,后跟任何非)字符和后跟)的行。然后,将字符串的开头Mbps (替换为空字符串,并将)的结尾替换为空字符串。

如果转换为数字(+0)的剩余行大于500,则打印行号和行。

awk '
  /Mbps \([^)]*\)/{ sub(/.*Mbps \(/, ""); sub(/\).*/, "") }
  ($0+0) > 500{ print FNR, $0 }
' file

0
投票

我改进了@Freddy的解决方案

awk '/Mbps.\(.*\)/{sub(/.*Mbps \(/, ""); sub(/\).*/, "")} ($0+0) > 500{print $0}' output.log

请给他小费:))


0
投票
$ awk '{match($0,/Mbps \(([^\)]+)\)/,a);if(a[1] > 500){print NR,a[1]} }' ./infile
2 500.15
3 1500.01
© www.soinside.com 2019 - 2024. All rights reserved.