Python 使用正则表达式仅提取带宽值
如何从以下转储中提取带宽值Python 使用正则表达式仅提取带宽值,python,regex,awk,sed,Python,Regex,Awk,Sed,如何从以下转储中提取带宽值 ------------------------------------------------------------ Server listening on TCP port 5001 TCP window size: 85.3 KByte (default) ------------------------------------------------------------ [ 4] local 192.168.1.1 port 5001 connecte
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51725
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 10.7 GBytes 9.17 Gbits/sec
[ 5] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51726
[ 5] 0.0-10.0 sec 10.7 GBytes 9.17 Gbits/sec
[ 4] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51727
[ 4] 0.0-10.0 sec 10.6 GBytes 9.10 Gbits/sec
[ 5] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51728
[ 5] 0.0-10.0 sec 10.4 GBytes 8.91 Gbits/sec
[ 4] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51729
[ 4] 0.0-10.0 sec 10.8 GBytes 9.23 Gbits/sec
[ 5] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51730
[ 5] 0.0-10.0 sec 10.7 GBytes 9.22 Gbits/sec
[ 4] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51731
[ 4] 0.0-10.0 sec 10.7 GBytes 9.23 Gbits/sec
[ 5] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51732
[ 5] 0.0-10.0 sec 10.7 GBytes 9.16 Gbits/sec
[ 4] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51733
[ 4] 0.0-10.0 sec 10.6 GBytes 9.13 Gbits/sec
[ 5] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51734
[ 5] 0.0-10.0 sec 10.5 GBytes 9.02 Gbits/sec
[ 4] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 51735
[ 4] 0.0-10.0 sec 10.3 GBytes 8.85 Gbits/sec
我的预期产出是
9.17,9.17,9.10,8.91,9.23,9.22,9.23,9.16,9.13,9.02,8.95
我只尝试过用python来做这件事,但我想知道其他更快更简单的方法来提取这个细节。
awk
将是一个很好的选择
$ awk -v ORS="," '$8 == "Gbits/sec"{print $7}' file
9.17,9.17,9.10,8.91,9.23,9.22,9.23,9.16,9.13,9.02,8.85,
它的作用是什么?
将输出记录分隔符设置为-v ORS=“,”
。这使得每个,
由打印
分隔,
检查第8列是否匹配“$8==“Gbits/sec”
,如果匹配,则打印7个字段,该字段为带Gbits/sec
如果您担心最后一个
,
,那么我们可以写
$ awk -v ORS="" '$8 == "Gbits/sec"{print sep$7; sep=","} END{print "\n"}' file
编辑 正如@mklement0所指出的,如果行的开头像say
[111]
那样被填满,则此操作可能会失败。那样的话,我们可以重写为
$ awk -v ORS="" '$NF == "Gbits/sec"{print sep$(NF-1); sep=","} END{print "\n"}' file
这里,
NF
是每行中的字段/列数。因此,$NF
将是最后一个字段,$(NF-1)
将是最后第二列。如果pcre
选项可用,则使用grep
$ grep -oP '[0-9.]+(?=\s*Gbits)' ip.txt | paste -sd,
9.17,9.17,9.10,8.91,9.23,9.22,9.23,9.16,9.13,9.02,8.85
要提取的数字[0-9.]+
仅当后跟可选空格和文本(?=\s*Gbits)
Gbits
- 然后使用
命令将输出合并为一行,并使用paste
作为分隔符,
从
mangrep
和manpaste
grep、egrep、fgrep、rgrep-打印与图案匹配的线条
-o、 --仅匹配
仅打印匹配行中匹配的(非空)部分,每个部分在单独的输出行上
-P、 --perl regexp
将模式解释为与Perl兼容的正则表达式(PCRE)。这是高度实验性的,grep-P可能
警告未实现的功能
粘贴-合并文件行
-s、 --连载
一次粘贴一个文件,而不是并行粘贴
-d、 --分隔符=列表
重用列表中的字符而不是选项卡中的字符
定义“更快”。我提出了一个用76ms完成的正则表达式。我有一个很大的数据集,所以ms是可以接受的。我只是希望它在处理方面有一个较小的占用空间。除非您向我们展示您所做的尝试,否则我们不需要确定这一点。如果您有
grep
和pcre
选项,请尝试grep-oP'[0-9.]+(?=\s*Gbits)文件|粘贴-sd,
假设所有文件都是Gbits
唉@用户2532296,您是否只对如何实现您的解决方案感兴趣,而不是以更好的方式解决此问题?另外,sundeep的回答没有使用python、awk或sed(您尚未添加到问题中的代码)。如果您对减少问题的反对票感兴趣,您可能需要清理一下。您对$8
的测试是针对示例输入中的整个字符串进行的。如果使用==
而不是~
,可以节省一些处理时间。(虽然string是正则表达式,但也可以是-a-string。)@ghoti是的,我不知道为什么,但它第一次对我不起作用,所以我想跳过。我已经更正了答案。谢谢你的邀请suggestion@mklement0很好。我没想那么多。编辑了我的答案。谢谢你指出。@EdMorton我已经用-v
和新行更正了这个问题。希望现在天气好。谢谢你的建议