![sort、uniq、cut 保留附加字段](https://linux22.com/image/996120/sort%E3%80%81uniq%E3%80%81cut%20%E4%BF%9D%E7%95%99%E9%99%84%E5%8A%A0%E5%AD%97%E6%AE%B5.png)
我有一个包含三列/字段的文本文件:时间、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