操纵列字段以进行清洁表示

时间:2015-02-19 20:51:31

标签: python linux bash shell scripting

嗨我在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

任何帮助?

感谢

3 个答案:

答案 0 :(得分:1)

您可以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\.]+(?!:)'匹配数字与点([\d\.]+)的任意组合,其前面有空格而不是:

答案 1 :(得分:1)

如果你想考虑awk:

awk -F '[ ,]' '{sub(/:.+$/, "", $3); sub(/:.+$/, "", $5); print $3, $5, $11}' 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(/:.+$/, "", $3); a[$3]+=$11} END{for (i in a) print i, a[i]}' file
10.20.10.144 2896

答案 2 :(得分:0)

教科书Awk:正确分割成字段,只打印一些字段,做一些分组算术并在结尾打印出总数:

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