如何从日志文件提取特定位置唯一IP对应的完整行
提取日志中特定位置IP唯一的完整行
问题背景
我有一份日志文件,需要筛选出**ab0.567后方IP地址**唯一的完整日志行——即该位置的IP在结果中只保留一行,不管其他字段内容是否重复。
输入日志示例
Jan 11 11:11:11 2020-12-01 11: 11:11: {ABC-ABCDE-AB-123}ABCDEFGHI_ABCDEFG_ABCD: application:none, ab0.567 123.45.67.890:56789 [111.111.111.111:12345] -> 117.140.11.11:123 (TCP) Jan 11 11:11:11 2020-12-01 11: 11:11: {ABC-ABCDE-AB-123}ABCDEFGHI_ABCDEFG_ABCD: application:none, ab0.567 123.45.67.890:12345 [111.111.111.111:12345] -> 110.140.11.11:123 (TCP) Jan 11 11:11:11 2020-12-01 11: 11:11: {ABC-ABCDE-AB-123}ABCDEFGHI_ABCDEFG_ABCD: application:none, ab0.567 123.45.67.890:56789 [111.111.111.111:12345] -> 117.140.11.11:123 (TCP) Jan 11 11:11:11 2020-12-01 11: 11:11: {ABC-ABCDE-AB-123}ABCDEFGHI_ABCDEFG_ABCD: application:none, ab0.567 123.75.88.860:98765 [111.111.111.111:12345] -> 117.140.79.118:123(UDP) Jan 11 11:11:11 2020-12-01 11: 11:11: {ABC-ABCDE-AB-123}ABCDEFGHI_ABCDEFG_ABCD: application:none, ab0.567 123.75.88.860:98765 [111.111.111.111:12345] -> 117.140.79.118:123(UDP)
期望输出
Jan 11 11:11:11 2020-12-01 11: 11:11: {ABC-ABCDE-AB-123}ABCDEFGHI_ABCDEFG_ABCD: application:none, ab0.567 123.45.67.890:12345 [111.111.111.111:12345] -> 110.140.11.11:123 (TCP) Jan 11 11:11:11 2020-12-01 11: 11:11: {ABC-ABCDE-AB-123}ABCDEFGHI_ABCDEFG_ABCD: application:none, ab0.567 123.75.88.860:98765 [111.111.111.111:12345] -> 117.140.79.118:123(UDP)
解决方案
使用awk快速实现
可以通过awk提取目标IP(剔除端口部分),用数组记录已出现的IP,按需保留每个IP对应的行:
1. 保留每个IP的最后一次出现行
如果需要保留该IP最后一次出现的完整日志行,执行以下命令:
awk -F 'ab0.567 ' '{split($2, ip_part, ":"); if (!seen[ip_part[1]]++) print $0}' your_log_file.txt
2. 保留每个IP的第一次出现行
如果需要保留该IP首次出现的完整日志行,调整命令为:
awk -F 'ab0.567 ' '{split($2, ip_part, ":"); if (!seen[ip_part[1]]) {seen[ip_part[1]]=1; print $0}}' your_log_file.txt
命令说明
-F 'ab0.567 ':将ab0.567作为字段分隔符,这样$2就包含了目标IP+端口及后续所有内容split($2, ip_part, ":"):把$2按冒号拆分,ip_part[1]就是我们要判断唯一性的纯IP地址seen[ip_part[1]]:用数组seen记录IP是否已出现,通过判断数组值来决定是否输出当前行
内容的提问来源于stack exchange,提问作者Bhawishya Khanal
相关产品推荐
相关产品推荐

