sort、uniq、cut 保留附加字段

sort、uniq、cut 保留附加字段

我有一个包含三列/字段的文本文件:时间、ip 源地址和类型 (tcp、udp、icmp)。请参阅底部的示例。

我必须按 IP 源地址排序,以确定那些包含 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

答案1

只是awk

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

  • 在 中END,打印键和值,其中值为>=100


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

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

  • sort对内容进行排序

  • uniq -c获取计数

  • awk '$1 >= 100'获取第一个字段(计数)所在的行>=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

相关内容