我相信你很好!
我正在使用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脚本向导,我们将不胜感激!
提前感谢!
您可以使用awk
来匹配包含Match (
,后跟任何非)
字符和后跟)
的行。然后,将字符串的开头Mbps (
替换为空字符串,并将)
的结尾替换为空字符串。
如果转换为数字(+0
)的剩余行大于500,则打印行号和行。
awk '
/Mbps \([^)]*\)/{ sub(/.*Mbps \(/, ""); sub(/\).*/, "") }
($0+0) > 500{ print FNR, $0 }
' file
我改进了@Freddy的解决方案
awk '/Mbps.\(.*\)/{sub(/.*Mbps \(/, ""); sub(/\).*/, "")} ($0+0) > 500{print $0}' output.log
请给他小费:))
$ awk '{match($0,/Mbps \(([^\)]+)\)/,a);if(a[1] > 500){print NR,a[1]} }' ./infile
2 500.15
3 1500.01