如何用Shell命令结合 正则表达式 统计文本中的ip地址数量

embedded/2024/10/21 9:59:37/

文章目录

      • 简介
      • 问题
      • 回答

简介

IP 地址(Internet Protocol Address)是互联网协议地址的简称,是互联网上为联网的设备(如计算机、服务器、路由器、手机等)分配的唯一标识符。IP 地址的主要功能是实现不同网络设备之间的通信,确保数据包能够准确无误地从源地址传输到目标地址。

IP 地址如同网络世界的门牌号码,为每个联网设备提供独一无二的身份标识。通过 IP 地址,数据包可以在全球范围的互联网中找到确切的目的地。IP 地址是 TCP/IP 协议栈中网络层的核心要素,为上层协议(如 TCP、UDP、HTTP、SSH 等)提供服务,实现应用程序间的网络通信。

存在两种主要版本的 IP 地址,IPv4 是最广泛使用的版本,采用 32 位二进制数表示,通常写为点分十进制形式,如 192.168.0.1。IPv6 是为应对 IPv4 地址耗尽而设计的新一代地址体系,使用 128 位二进制数表示,通常写为冒号分隔的十六进制数,如 2001:0db8:85c3:0000:0000:8a5e:0370:7339。人们说的 IP 地址通常是指 IPv4 地址。

问题

运维工作中,一种常见需求是统计文件中 ip 地址的数量,比如统计服务器上指定日志文件中的 ip 数量。

那么如何用 shell 命令来完成这个任务呢?

回答

要使用 Bash 命令统计文本文件中 IP 地址串的数量,可以拆分为两个步骤:

  1. 使用 grep 配合正则表达式筛选 IP 地址
    使用 grep 命令配合能够匹配 IPv4 地址的正则表达式,从文本文件中筛选出所有 IP 地址。

  2. 计数筛选结果行数
    利用 wc -l 命令计算上一步筛选结果的行数,即可得到 IP 地址的总数。

将这两步结合在一起,起初想到的命令如下:

bash">grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' ip-addresses.txt | wc -l

命令解析

  • grep

    • -o:只输出匹配到的部分,每一部分单独占一行。
    • -E:使用扩展正则表达式(ERE),以便我们可以使用更简洁的正则写法。
    • '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b':这是匹配 IPv4 地址的正则表达式,解释如下:
      * \b:单词边界,确保 IP 地址前后没有其他字符干扰。
      * ([0-9]{1,3}\.){3}:匹配连续三次的数字(1 到 3 位)后面跟着一个点号,即 IP 地址的前三段。
      * [0-9]{1,3}:匹配最后一段数字(1 到 3 位)。
      * 整个正则表达式目的是匹配点分十进制形式的 ip 地址。
  • ip-addresses.txt:被统计的文件名,使用时替换为待统计 IP 地址的文本文件的实际路径。

  • wc -l

    • wc 是 Word Count (词数统计)命令,用于计算行数、单词数、字符数等。
    • -l 选项指定只计算行数,在这里就是统计出 IP 地址的个数。

执行上述命令后,Bash 会输出 ip-addresses.txt 文件中 IP 地址的总数。

我们编写一个待测试文件,内容如下:

192.168.1.27
0.0.0.0  1.22.3.123 1.234.34.0 123.45.6.78
address is 23.5.5.5_2.3.4.5_
192.168
172.18.19
123.4.12.259 22.333.0.100
1.22.233.4444
abc1.2.5.200  2.3.44.55ef

文件中符合预期的 ip 地址数量是 6。

使用上述命令测试,输出结果是 8,

在这里插入图片描述

分析上述可知命令将 123.4.12.259 22.333.0.100 这两个字符串判断为 ip 地址了。
如何修改命令中的正则表达式来避免这个错误呢?

我们知道,点分十进制形式的 ip 地址由三个点号分隔的四个十进制数组成,其中每个十进制的有效范围是 0~255
经过搜索学习,笔者将命令改为

bash">grep -oP '\b(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|2[0-4]\d|25[0-5])\b' ip-addresses.txt` | wc -l
  • -P: 选项启用 Perl 兼容的正则表达式(PCRE)。相比基本正则表达式,PCRE 提供了更丰富的功能和更灵活的匹配规则。

  • '\b(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|2[0-4]\d|25[0-5])\b': 这是用于匹配 IPv4 地址的 Perl 兼容正则表达式。解释如下:

    • (([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}: 重复 3 次的子模式,用于匹配 IP 地址的前三段。子模式内部结构如下:

      • ([01]?\d\d?|2[0-4]\d|25[0-5]): 三种可能的 IPv4 段值的组合,确保值在 0 到 255 之间。具体解释如下:

        • [01]?\d\d?: 匹配 0 到 199 之间的数,可以是一位、两位或三位数,这个模式如果匹配三位数则第一位只能是 0 或 1。
        • 2[0-4]\d: 匹配 200 到 249 之间的数,第一位固定是 2,第二位是 0 到 4 之间的数,第三位是任何数字。
        • 25[0-5]: 匹配 250 到 255 之间的数,第一位固定是 2,第二位是 5,第三位是 0 到 5 之间的数。
        • |: 上述三个子模式被竖线分开,表示“或”的关系。
      • \.: 匹配点号,作为十进制数之间的分隔符。

    • ([01]?\d\d?|2[0-4]\d|25[0-5]): 类似于前面的子模式,用于匹配 IPv4 地址的最后一段,确保其值在 0 到 255 之间。

再进行测试,输出结果是 6,符合预期。

在这里插入图片描述

可见经过改进后的命令能够精确匹配合法的 IP 地址,避免匹配到诸如 123.4.12.259 这样的无效地址。


参考:

  • man grep
  • man pcre

相关阅读:

  • 在Bash中如何提取子字符串
  • 一行命令搞定:Bash结合正则表达式实现高效定位与终结进程的实战解析
  • arping命令详解
  • 在vxlan网络中使用tcpdump精确过滤抓包
  • nc命令详解

http://www.ppmy.cn/embedded/118098.html

相关文章

RabbitMQ是什么?RabbitMQ简介

一:技术背景 假如我们有一个支付服务,支付服务的业务逻辑是:首先支付扣减余额,更新支付单状态,更新订单状态,发短信,给这个用户增加积分。在这个场景下,如果我们使用同步调用通信&am…

【ShuQiHere】深入理解二叉搜索树(Binary Search Tree, BST):结构、操作与代码实现

【ShuQiHere】 🌳 引言 在数据结构的世界里,二叉搜索树(Binary Search Tree, BST) 是一种非常重要且常见的结构。它广泛应用于数据库系统、文件系统、网络路由表和搜索引擎中。通过二叉搜索树,我们可以高效地进行查找…

探索 ShellGPT:终端中的 AI 助手

文章目录 探索 ShellGPT:终端中的 AI 助手背景介绍ShellGPT 是什么?如何安装 ShellGPT?简单的库函数使用方法场景应用常见问题及解决方案总结 探索 ShellGPT:终端中的 AI 助手 背景介绍 在当今快速发展的技术领域,命…

Java | Leetcode Java题解之第436题寻找右区间

题目&#xff1a; 题解&#xff1a; class Solution {public int[] findRightInterval(int[][] intervals) {int n intervals.length;int[][] startIntervals new int[n][2];int[][] endIntervals new int[n][2];for (int i 0; i < n; i) {startIntervals[i][0] inter…

JavaEE:探索网络世界的魅力——玩转UDP编程

文章目录 UDPUDP的特点UDP协议端格式校验和前置知识校验和具体是如何工作的? UDP UDP的特点 UDP传输的过程类似于寄信. 无连接: 知道对端的IP和端口号就直接进行传输,不需要建立连接.不可靠: 没有确认机制,没有重传机制,如果因为网络故障导致该段无法到达对方,UDP协议也不会…

UDP Socket聊天室(Java)

UDP聊天室&#xff1a;循环的发送字 通过while循环&#xff0c;文字一直可以发送 dp.getData()是获取DatagramPacket中存储的数据的字节数组。 发送端&#xff1a; package TseUDP;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.Inet…

气压高度加误差的两种方法(直接添加 vs 换算到气压误差),附MATLAB程序

在已知高度真实值时,如果需要计算此高度下的气压计误差,可考虑本文所述的两种方法 气压高度 气压与高度之间的关系可以用大气压的垂直变化来描述。随着高度的增加,气压通常会下降。这是因为空气的密度在高度增加时减少,导致上方空气柱对下方空气施加的压力减小。 主要关系…

速记篇 |TCP/IP五层模型怎么背,OSI七层模型怎么背?

背景 记忆TCP/IP五层模型和OSI七层模型可以通过理解每一层的功能、作用以及它们之间的逻辑关系来进行。下面分别给出这两个模型的记忆方法和要点&#xff1a; TCP/IP五层模型 TCP/IP五层模型是一个简化的模型&#xff0c;从下到上依次为&#xff1a; 1.物理层&#xff08;Physi…