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

文章目录

      • 简介
      • 问题
      • 回答

简介

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 地址的总数。

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

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
经过搜索学习,笔者将命令改为

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.xdnf.cn/news/1542736.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[Python]一、Python基础编程(2)

F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\1、人工智能开发入门\1、零基础Python编程 1. 文件操作 把⼀些内容 ( 数据 )存储存放起来,可以让程序下⼀次执⾏的时候直接使⽤,⽽不必重新制作⼀份,省时省⼒ 。 1.1 文件的基本操作 1. 打开文件 2. 读写操作 3. 关闭…

hive-拉链表

目录 拉链表概述缓慢变化维拉链表定义 拉链表的实现常规拉链表历史数据每日新增数据历史数据与新增数据的合并 分区拉链表 拉链表概述 缓慢变化维 通常我们用一张维度表来维护维度信息,比如用户手机号码信息。然而随着时间的变化,某些用户信息会发生改…

【软件工程】需求分析概念

一、定义 二、为什么要进行需求分析? 三、需求分析任务 四、与用户沟通获取需求的方法 五、分析建模 六、软件需求规格说明 例题 选择题

【题解】【枚举,数学】——小 Y 拼木棒

【题解】【枚举,数学】——小 Y 拼木棒 小 Y 拼木棒题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示数据规模与约定 1.题意简述2.思路解析3.AC代码 前置知识:排列组合,暴力枚举基础知识。 小 Y 拼木棒 通往洛谷的传送门 …

基于SpringBoot+Vue+MySQL的医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会,随着医疗服务需求的不断增长和医疗信息化的快速发展,提升医院管理效率和服务质量成为了医疗行业的核心需求。传统的医院管理模式面临着效率低下、资源分配不均、患者就医体验差等问题。为了应…

图像处理基础知识点简记

简单记录一下图像处理的基础知识点 一、取样 1、释义 图像的取样就是图像在空间上的离散化处理,即使空间上连续变化的图像离散化, 决定了图像的空间分辨率。 2、过程 简单描述一下图象取样的基本过程,首先用一个网格把待处理的图像覆盖,然后把每一小格上模拟图像的各个…

一种求解无人机三维路径规划的高维多目标优化算法,MATLAB代码

在无人机三维路径规划的研究领域,高维多目标优化算法是一个重要的研究方向。这种算法能够同时考虑多个目标,如航迹距离、威胁代价、能耗代价以及多无人机协同性能等,以实现无人机路径的最优规划。 无人机路径规划算法的研究进展表明&#xf…

中国最厉害的改名大师,颜廷利教授的名字来自于国学易经元亨利贞

颜廷利教授,一位源自齐鲁大地山东济南的世界级文化名人,他的名字背后承载着深厚的家族易学传统。在颜廷利教授的童年记忆中,家族长辈常以《易经》中频繁出现的“元、亨、利、贞”四字,寓意四季之变换,将这四个字分别对…

Qt_对话框QDialog的介绍

目录 1、新建项目对话框 2、非模态对话框 3、模态对话框 4、自定义对话框 5、Qt内置对话框 5.1 消息对话框QMessageBox 5.2 颜色对话框QColorDialog 5.3 文件对话框QFileDialog 5.4 字体对话框QFontDialog 5.5 输入对话框QInputDialog 结语 前言: 在Qt中&…

使用Stream实现事件流

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了Flutter中的异步操作,本章回中将介绍Flutter中的事件流.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在上一章回中介绍了异步操作相关的内容,本章回中将介绍如何把…

51.字符串比较实例-用户登录

//已知正确的用户名和密码,请用程序实现模拟用户登录 //总共三次机会,登录之后给出相应的提示 import java.util.Scanner;public class 登录 {public static void main(String[] args) {//1.定义两个变量,记录正确的用户名和密码String righ…

【kaggle竞赛】毒蘑菇的二元预测题目相关信息和思路求解代码

毒蘑菇的二元预测 您提供了很多关于不同二元分类任务的资源和链接,看起来这些都是Kaggle竞赛中的参考资料和高分解决方案。为了帮助您更好地利用这些资源,这里是一些关键点的总结: Playground Season 4 Episode 8 主要关注的竞赛: 使用银行…

深入理解 JavaScript 三大作用域:全局作用域、函数作用域、块级作用域

一. 作用域 对于多数编程语言,最基本的功能就是能够存储变量当中的值、并且允许我们对这个变量的值进行访问和修改。那么有了变量之后,应该把它放在哪里、程序如何找到它们?是否需要提前约定好一套存储变量、访问变量的规则?答案…

【线程池】ThreadPoolExecutor应用

ThreadPoolExecutor应用 每一步的坚持与积累,都是铸就高薪和大牛的必经的修炼 哈哈,不吹牛逼了,今天来分享最近在提升中的学习总结,无论是对在职场还是求职,看完,我相信都会有些许的收获和成长 也难得过了一个悠闲点的周末,哈哈哈,一起奥利给!! 本文总纲: 1.为什么要自定义线程…

java8 常用操作案例【经典版】超赞!

目录 一 案例 1.1 对象转list 1.2 过滤对象 1.3 排序 1.4 匹配 1.5 最大值最小值 1.6 拼接字符串 1.7 求和 1.8 分组 1.9 分组求和 1.10 综合案例 一 案例 1.1 对象转list /*** author admin对象转map ; mapper层实体类获取,到业务层转换为DTO,* return void…

《python语言程序设计》2018版第8章18题几何circle2D类(中部)

第一、重新分析 第一-1、我设计的第一模式第一-1-1、遇到的逻辑分析迷雾第一-1-2、无畏挣扎后的无奈 第二-1、我就把你们两个放到一起,第二-2、我的想法 当我看到了这个2个园并且比对. 第一-1、我设计的第一模式 设计一个最抽象的Circle2D类. 这个类只包含一个x,y和circle 这个…

初始C++中的string与迭代

常用的string构造相关类的接口 string类是一个管理字符串的字符数组,string类的出现方便管理我们日常所遇见的,字符名,字符串等等。下面们介绍一下常见的string类接口。 string(); 默认构造,构造空的string类 int main() { …

深度学习电脑独显GPU占用一直0%解决方式

在系统设置里面把硬件加速GPU计划关了 然后重启 再随便跑个模型 打开任务管理器可以看到独显开始工作了 再在GPU1中将3D改成Cuda即可

Vue项目之Element-UI(Breadcrumb)动态面包屑效果 el-breadcrumb

效果预览 需要导航的页面Vue.js 最笨的方法就是在每个需要面包屑的页面中固定写好 <template><div class="example-container"><el-breadcrumb separator="/"

【Linux-基础IO】C语言文件接口回顾 系统文件概念及接口

目录 一、C语言文件接口回顾 C语言基础知识 C中文件操作示例 二、系统文件概念及接口 重定向基本理解的回顾 文件的基本概念 系统调用接口 open read write close lseek 什么是当前路径 一、C语言文件接口回顾 引言&#xff1a;我们并不理解文件&#xff01;从语…