You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux中提取每行五元组内首个IP并忽略无IP行的方法

提取日志每行首个IP并忽略无IP行的解决方法

方法1:使用awk的match函数

命令:

awk 'match($0, /([0-9]{1,3}\.){3}[0-9]{1,3}/, ip_arr) {print ip_arr[0]}' your_log_file.log

解释:

  • match($0, /([0-9]{1,3}\.){3}[0-9]{1,3}/, ip_arr) 会在当前行中匹配符合IP格式的内容,把匹配结果存入ip_arr数组
  • 只有当行内存在IP(匹配成功)时,才会执行print ip_arr[0],输出该行第一个匹配到的IP
  • 自动忽略没有IP的行,完全贴合需求

方法2:grep + sed组合

命令:

grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' your_log_file.log | sed -E 's/^.*?(([0-9]{1,3}\.){3}[0-9]{1,3}).*/\1/'

解释:

  • 第一步用grep -E过滤出所有包含IP的行,直接排除无IP的行
  • 第二步用sed -E做正则替换:^.*?从行首开始非贪婪匹配到第一个IP前的内容,\1引用捕获到的第一个IP,把整行替换成这个IP,从而保留每行的首个IP

方法3:Perl一行命令

命令:

perl -ne 'print "$1\n" if /([0-9]{1,3}\.){3}[0-9]{1,3}/' your_log_file.log

解释:

  • -ne参数让Perl逐行处理日志内容
  • 正则匹配到首个IP后,将其捕获到$1并打印;没有匹配到IP的行直接跳过

补充说明

你之前用awk '{print $4}'的问题在于,它是按固定字段位置提取,但日志里IP的位置不一定是第4个字段,而且会强制输出无IP行的第4字段,没法满足“忽略无IP行+提取首个IP”的要求。上面的方法都是基于正则匹配IP,不管IP在每行的哪个位置,都能精准提取首个IP并跳过无IP行。

内容的提问来源于stack exchange,提问作者S VIJAY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 01:09:18