操纵列字段以获得清晰的表示
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-around 与 re.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]}'
您好,我在 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-around 与 re.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]}'