sort,uniq,cut保留额外的字段

我有一个包含三列/字段的文本文件:time,ip source address和type(tcp,udp,icmp)。 请参见底部的示例。

我不得不按IPsource地址排序,以确定那些包含100个或更多数据包的地址,并且只保留这些地址。 我用cut,uniq,awk来获得这样的东西:

149 109.67.66.151 165 110.139.3.179 204 110.4.80.107 112 111.118.55.173 169 111.240.103.56 

但是在这个过程中我丢失了tcp / udp / icmp字段。 有没有办法保持相应的IP地址的这个字段,并得到类似的东西:

 149 109.67.66.151 TCP 165 110.139.3.179 UDP 204 110.4.80.107 TCP 112 111.118.55.173 ICMP 169 111.240.103.56 TCP 

原始文件样本:

 1385940727.551004 111.8.17.50 TCP 1385940735.434301 111.8.17.50 TCP 1385940739.646539 111.8.17.50 TCP 1385940755.767752 111.8.17.50 TCP 1385940758.258988 111.8.17.50 TCP 1385940762.911809 111.8.17.50 TCP 1385940791.310308 111.8.17.50 TCP 1385940807.928309 111.8.17.50 TCP 1385940828.261464 111.8.17.50 TCP 1385940949.030512 111.8.17.50 TCP 1385936137.681823 111.87.58.139 ICMP 1385936137.692510 111.87.58.139 ICMP 1385936159.164373 111.87.58.139 ICMP 1385936595.854667 111.87.58.139 ICMP 1385936595.865145 111.87.58.139 ICMP 1385936939.448178 111.87.58.139 ICM 

只是awk

 awk '{$1=""; a[$0]++} END{for (i in a) if (a[i]>=100) print a[i]i}' file.txt 
  • 使用键作为字段创建数组a ,使第一个字段为null,将值作为字段的计数(键)

  • END ,键值和值将打印在值>=100


常用工具的组合(正如您所使用的):

 cut -d' ' -f2- file.txt | sort | uniq -c | awk '$1 >= 100' 
  • cut -d' ' -f2- file.txt从空格分隔的第二个字段中获取直到结束

  • sort对内容sort排序

  • uniq -c获得计数

  • awk '$1 >= 100'得到第一个字段(count) >=100

示例:使用阈值为10:

 % cat file.txt 1385940727.551004 111.8.17.50 TCP 1385940735.434301 111.8.17.50 TCP 1385940739.646539 111.8.17.50 TCP 1385940755.767752 111.8.17.50 TCP 1385940758.258988 111.8.17.50 TCP 1385940762.911809 111.8.17.50 TCP 1385940791.310308 111.8.17.50 TCP 1385940807.928309 111.8.17.50 TCP 1385940828.261464 111.8.17.50 TCP 1385940949.030512 111.8.17.50 TCP 1385936137.681823 111.87.58.139 ICMP 1385936137.692510 111.87.58.139 ICMP 1385936159.164373 111.87.58.139 ICMP 1385936595.854667 111.87.58.139 ICMP 1385936595.865145 111.87.58.139 ICMP 1385936939.448178 111.87.58.139 UDP 1385936939.448178 111.87.58.139 UDP % awk '{$1=""; a[$0]++} END{for (i in a) if (a[i]>=10) print a[i]i}' file.txt 10 111.8.17.50 TCP % cut -d' ' -f2- file.txt | sort | uniq -c | awk '$1 >= 10' 10 111.8.17.50 TCP