首页 > 解决方案 > 如何匹配文件每一行上第一次出现的模式(IP 地址)?

问题描述

我有一个文本文件(file.txt),其中包含以下行 -

1234      198.18.1.1  5.6.7.8   user1   10 Gbps 32 GB -
15.2.1.2  198.18.1.2  9.10.11   user2   10 Gbps 16 GB (connected to 198.18.1.3)
and so on

所有 IP 地址的第一个八位字节是 3 位数字(例如 198)。如何在每一行中找到 IP 地址的第一个匹配项?

输出

198.18.1.1
198.18.1.2

我试过 -

grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' file.txt

但那又回来了——

198.18.1.1  
5.6.7.8
15.2.1.2  
198.18.1.2
198.18.1.3

谢谢!

标签: regexawksedgrep

解决方案


如果您想首先匹配以 3 位数字开头的每一行的 IP 地址,一个选项是将 grep 与第一个量词一起-oP使用{3}。用于\K清除当前匹配缓冲区。

grep -oP '^.*?\b\K[0-9]{3}(?:\.[0-9]{1,3}){3}\b' file.txt

正则表达式演示| grep 演示

解释

  • ^字符串的开始
  • .*?\b尽可能少地匹配任何字符,单词边界以防止单词成为更长匹配的一部分
  • \K清除匹配缓冲区
  • [0-9]{3}(?:\.[0-9]{1,3}){3}\b匹配一个类似 ip 的模式,从 3 位数字开始使用{3}

输出

198.18.1.1
198.18.1.2

推荐阅读