操纵列字段以获得清晰的表示

manipulate column fields for clean representation

您好,我在 txt 文件中有以下格式的数据

TCP dmz 10.20.10.144:8080 inside 10.1.1.98:59217, idle 0:00:11, bytes 1295, flags UFRIO
TCP dmz 10.20.10.144:8082 inside 10.1.1.98:31949, idle 0:00:13, bytes 956, flags UfrIO
TCP dmz 10.20.10.144:8082 inside 10.1.1.97:60194, idle 0:00:16, bytes 645, flags UfrIO

我只想提取

IP 地址和字节字段,所以最终结果应该是

10.20.10.144 10.1.1.98 1295
10.20.10.144 10.1.1.98 956
10.20.10.144 10.1.1.97 645

最后我还想按第一个字段的字节(第 3 列)进行分组。获得:

10.20.10.144 2896

有什么帮助吗?

谢谢

您可以将 look-aroundre.findall() 一起使用:

>>> [re.findall(r'(?<= )[\d\.]+(?!:)',line) for line in open('your_filename','r')]
[['10.20.10.14', '10.1.1.9', '1295'], 
 ['10.20.10.14', '10.1.1.9', '956'], 
 ['10.20.10.14', '10.1.1.9', '645']]

下面的模式 r'(?<= )[\d\.]+(?!:)' 匹配前面有 space 而后面没有 : 的带点 ([\d\.]+) 的任意数字组合。

如果要考虑awk:

awk -F '[ ,]' '{sub(/:.+$/, "", ); sub(/:.+$/, "", ); print , , }' file
10.20.10.144 10.1.1.98 1295
10.20.10.144 10.1.1.98 956
10.20.10.144 10.1.1.97 645

编辑: 基于以下评论:

awk -F '[ ,]' '{sub(/:.+$/, "", ); a[]+=} END{for (i in a) print i, a[i]}' file
10.20.10.144 2896

教科书 Awk:正确拆分为字段,仅打印部分字段,进行一些分组运算并在最后打印出总计:

awk -F'[ :,]' '{print , , ; sum[]+=} END {for (i in sum) print i, sum[i]}'