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==“Gbits/sec”
    检查第8列是否匹配
    Gbits/sec
    ,如果匹配,则打印7个字段,该字段为带


如果您担心最后一个
,那么我们可以写

$ 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
和新行更正了这个问题。希望现在天气好。谢谢你的建议