grep正则匹配和sed正则匹配的简单例子_sed匹配数字-程序员宅基地

技术标签: linux  

一、正则化匹配规则

1、在正则表达式中,如果直接给出字符,就是精确匹配。用\d可以匹配一个数字,\w可以匹配一个字母或数字
2、要匹配变长的字符,在正则表达式中,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符
4、^表示行的开头,^\d表示必须以数字开头。
5、$表示行的结束,\d$表示必须以数字结束。
6、要做更精确地匹配,可以用[]表示范围,比如:

[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;
[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100''0_Z''Py3000'等等;
[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
[a-zA-Z\_][0-9a-zA-Z\_]{
    0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。你可能注意到了,py也可以匹配'python',但是加上^py$就变成了整行匹配,就只能匹配'py'
来看一个复杂的例子:\d{
    3}\s+\d{
    3,8}。

我们来从左到右解读一下:

\d{
    3}表示匹配3个数字,例如'010';

\s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配' '' '等;

\d{
    3,8}表示3-8个数字,例如'1234567'。

综合起来,上面的正则表达式可以匹配以任意个空格隔开的带区号的电话号码。

如果要匹配'010-12345'这样的号码呢?由于'-'是特殊字符,在正则表达式中,要用'\'转义,所以,上面的正则是\d{
    3}\-\d{
    3,8}

二、grep正则匹配例子

#查看系统内存、缓存、交换分区 -e的作用是匹配多个表达式
cat /proc/meminfo|grep -e Mem -e Cache -e Swap

#查找/etc目录下的所有文件中的邮件地址;
grep -R -o -n -E '[a-z0-9]+\@[a-z0-9]+\.[a-z]{2,4}' /etc
#其中:-R:递归,-n表示匹配的行号,-o只输出匹配内容 -E:支持扩展正则表达式

#查找/etc/目录下文件包含"HOSTNAME"的次数,-c统计匹配次数,-v取反
grep -R -c 'HOSTNAME' /etc/|grep -v "0$"

#查找内核日志中eth的行,显示颜色及行号:
dmesg | grep -n --color=auto 'eth'

#用dmesg列出核心信息,再以grep找出含有eth哪行,在关键字所在行的前两行与后三行也一起找出出来显示
dmesg |grep -n -A3 -B2 --color=auto 'eth'

#统计系统中能登录的用户的个数
cat /etc/passwd |grep -c bash$

#统计httpd进程数量
ps -ef|grep -c httpd

#显示games 匹配的“-C”前后4行
grep -C 4 'games' --color /etc/passwd

#获取网卡名称:
ip a |grep -E '^[0-9]' |awk -F:'{print $2}'

#截取ip地址,[^]*表示以非空字符作为结束符,[0-9.]*表示数字和点的结合。
ifconfig eth0|grep -E -o 'inet addr:[^]*'|grep -o'[0-9.]*'

#截取MAC地址:
ifconfig eth0|grep -i hwaddr |awk '{print$5}'

#查看指定进程:
ps -ef|grep mysql
root 1688 1645 0 05:02 pts/0  00:00:00 grep mysql

三、sed正则匹配例子

#1. 取系统ip
[root@] ifconfig eth3 
eth3      Link encap:Ethernet  HWaddr 08:00:27:4C:6F:AD  
          inet addr:192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:18603 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7782 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2652530 (2.5 MiB)  TX bytes:1664897 (1.5 MiB)

方法1:sed ‘s#支持正则##g’ file

# 第一步:取到ip所在的行,取第二行
[root@] ifconfig eth3|sed -n '2p'
          inet addr:192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0
          
# 第二步:取中间的内容,先将前面的一段匹配掉,替换掉
[root@] ifconfig eth3|sed -n '2p'|sed 's#inet addr:##g'
          192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0
# 取内容时,必须要在这行内容中是唯一的,不是唯一的,默认会取到最后一个
[root@] ifconfig eth3|sed -n '2p'|sed 's#^.*:##g'      
255.255.255.0

# 将以任意字符开头的,长度0-N个的,以dr: 为结尾的内容替换掉
[root@] ifconfig eth3|sed -n '2p'|sed 's#^.*dr:##g' 
192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0

# 第三步:将要取的ip内容的后端从开头取替换掉
[root@] ifconfig eth3|sed -n '2p'|sed 's#^.*dr:##g'|sed 's#  B.*$##g'
192.168.0.109

处理技巧
匹配需要的目标(获取的字符串,如本例中的ip)前的字符串一般用以…开头(^.*)来匹配开头,匹配的结尾写上实际的字符。
如:"^.addr:" 表达式就匹配" inet addr:"
而处理需要的目标后的内容,一般在匹配的开头写上实际的字符,而结尾是用以…结尾(.
) 来 匹 配 。 如 : " B c a s t : . ∗ )来匹配。 如:"Bcast:.* )"Bcast:.“部分匹配表示"Bcast:10.0.0.255 Mask:255.255.255.0”

方法2:替换命令:sed -n ‘s#支持正则位置##gp’ file

指定行号:s前的2为 行号

sed -n '2s#支持正则位置##gp' file
[root@] ifconfig eth3|sed -n '2s#^.*dr:##gp'
192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0

[root@] ifconfig eth3|sed -n '2s#^.*dr:##gp'|sed -n 's#  Bc.*$##gp'
192.168.0.109

方法3:sed的后向引用 sed -nr ‘s#()()#\1\2#gp’ file

[root@] cat a.txt
I am oldboy Linux.

# 取任意字符开头,取任意字符一直到m;然后()内容是要输出的内容,任意字符;后面是以"L"开头的任意字符(N个)结尾。
# 替换掉 () 外面的内容,输出()内的内容
[root@] sed -nr 's#^.*m (.*) L.*$#\1#gp' a.txt
oldboy

当正则匹配部分使用(),第一个括号,可以在后面的部分用“\1”来输出;第二个括号的内容,可以用"\2"来输出。

 
获取ip的方法:


# 取第二行,开头任意字符,是...r:()  Bc...,输出 () 的内容。
[root@] ifconfig eth3|sed -nr '2s#^.*r:(.*)  Bc.*$#\1#gp'   
192.168.0.109

# 第二行都不取,条件定义好,直接就能输出结果
[root@] ifconfig eth3|sed -nr 's#^.*r:(.*)  Bc.*$#\1#gp' 
192.168.0.109

方法4: 用awk,grep等文本处理方式分列获取,sed命令是用于学习的

[root@] ifconfig eth3|awk -F "[ :]+" 'NR==2 {print $4}' 
192.168.0.109

[root@] grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth3|cut -d "=" -f 2
192.168.0.109

sed 方法替换的扩展练习:

1. 将下面文件的内容用sed替换方法取出 644:

[root@] stat /etc/hosts
  File: `/etc/hosts'
  Size: 158             Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 259614      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-10-01 00:00:08.875025775 +0800
Modify: 2010-01-12 21:28:22.000000000 +0800
Change: 2019-08-30 08:12:59.831999996 +0800

答案:

[root@] stat /etc/hosts|sed -nr 's#^.*: \(0(.*)/-rw.*$#\1#gp'
644

2. 将下面文件内容的第一列和最后一列做个对调

[root@] tail /etc/passwd
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
oldboy:x:500:500::/home/oldboy:/bin/bash
zoe:x:501:501::/home/zoe:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
beaty:x:502:502::/home/beaty:/bin/bash

答案:

正则表达式1:()()()三块分别借助单个匹配的特征,输出再拼接

[root@] tail /etc/passwd|sed -nr 's#(.*):x(.*):(.*)#\3:x\2:\1#gp' 
/sbin/nologin:x:68:68:HAL daemon:/:haldaemon
/sbin/nologin:x:38:38::/etc/ntp:ntp
/sbin/nologin:x:499:76:Saslauthd user:/var/empty/saslauth:saslauth
/sbin/nologin:x:89:89::/var/spool/postfix:postfix
/sbin/nologin:x:74:74:Privilege-separated SSH:/var/empty/sshd:sshd
/sbin/nologin:x:72:72::/:tcpdump
/bin/bash:x:500:500::/home/oldboy:oldboy
/bin/bash:x:501:501::/home/zoe:zoe
/sbin/nologin:x:48:48:Apache:/var/www:apache
/bin/bash:x:502:502::/home/beaty:beaty

正则表达式2:()()()三组分别匹配上内容

[root@] sed -nr 's#([^:]+)(:.*:)(/.*$)#\3\2\1#gp' /etc/passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
...
/bin/bash:x:501:501::/home/zoe:zoe
/sbin/nologin:x:48:48:Apache:/var/www:apache
/bin/bash:x:502:502::/home/beaty:beaty

四、工作中遇到的问题

1、插入U盘后自动识别盘符

dmesg |grep -E 'GiB|TiB'|tail -n 1|sed 's/^.*\[//g'|sed "s/\].*$//g"

上面的代码通过dmesg日志来查看的,通过sed的正则化来进行定位

2、删除有某个字符的这一行

#删除含有LABEL字符的行,默认在最后一行
sed  -i 's/^LABEL.*//g' /etc/fstab #正则化匹配,从LABEL开头到任意字符任意个全部替换为空
sed  -i '/LABEL/d' /etc/fstab
sed  -i '$d' /etc/fstab

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26884501/article/details/111314401

智能推荐

一文带你了解socket网络编程以及详解过程和原理_socket编程-程序员宅基地

文章浏览阅读1.1w次,点赞42次,收藏178次。Socket(套接字)是计算机网络编程中的一种抽象概念,它提供了在网络上进行通信的接口。通过使用 Socket,可以在不同计算机之间建立连接,并进行数据的传输和交换。通过 Socket,客户端可以与服务器建立连接并发送请求,服务器接收请求并返回响应。通过 Socket,可以在多个用户之间实现实时的文字、音频或视频通信。可以使用 Socket 在不同计算机之间传输文件,如上传和下载文件。可通过 Socket 在远程计算机上执行指令或操作。_socket编程

nodejs第三方模块 express框架 传参_nodejs express 模块间参数传递-程序员宅基地

文章浏览阅读413次。nodejs第三方模块 express框架 传参get接口动态参数以这个举例 http://localhost:8001/edit/124其中,/124传递的id值124就是动态参数服务器通过req.params获取app.get("/edit/:id",(req,res)=>{ console.log(req.params) res.send("发送成功")})这个在我们删除和编辑数据的时候最常用,根据指定的id删除内容,以及编辑内容时的数据回显。查询字符串参数_nodejs express 模块间参数传递

servlet注解开发-程序员宅基地

文章浏览阅读820次。跟请求对象/响应对象一样,也是在容器初始化时被创建好的对象;该对象可用于容器初始化时 servlet 辅助信息的设置;例如:编码格式的设置、servlet 在执行时需要的一些数据。在 web.xml 中 servlet 标签下可以进行 ServletConfig 辅助信息的设置格式:ServletConfig 对象和 Servlet 类是一对一的关系;只有 web.xml 配置文件中配置了。_servlet注解开发

从零开始学Python第19课:面向对象编程进阶(2024版)-程序员宅基地

文章浏览阅读661次,点赞24次,收藏13次。例如,我们定义一个学生类和一个老师类,我们会发现他们有大量的重复代码,而这些重复代码都是老师和学生作为人的公共属性和行为,所以在这种情况下,我们应该先定义人类,再通过继承,从人类派生出老师类和学生类,代码如下所示。子类继承父类的方法后,还可以对方法进行重写(重新实现该方法),不同的子类可以对父类的同一个方法给出不同的实现版本,这样的方法在程序运行时就会表现出多态行为(调用相同的方法,做了不同的事情)。需要提醒大家的是,对象的方法其实本质上也是对象的属性,如果给对象发送一个无法接收的消息,引发的异常仍然是。

初步了解SequoiaDB巨杉数据库-程序员宅基地

文章浏览阅读658次。1.SequoiaDB 简介2.整体架构3.数据库存储引擎4.核心特性。_sequoiadb

2020 年中国程序员薪资和生活现状调查报告_2020年薪酬数据报告-程序员宅基地

文章浏览阅读1.7k次,点赞6次,收藏3次。作者 | 程序员客栈来源 | ID:proginnwx根据中国互联网络信息中心(CNNIC)近日发布第 44 次《中国互联网络发展状况统计报告》。截至 2019 年 06 月,中国网民规模为 8.54 亿,较 2018 年底增加 2598 万。网上外卖用户规模达 4.21 亿,较 2018 年底增长 1516 万;网络视频用户规模达 7.59 亿,较 2018 年底增长 3391 万;我..._2020年薪酬数据报告

随便推点

计算机考研408每日一题 day78_命中率高且电路实现简单的cache内存映射方式-程序员宅基地

文章浏览阅读392次。对于二叉排序树,下面的说法 ___是正确的。(华南理工大学 2006年)设备驱动程序在读写磁盘数据时一般釆用下列哪种I/O方式?(中国科学院大学 2018)下列___交换技术是独占信道工作方式。(中南大学 2006年)命中率高且电路实现简单的Cache 与内存映射方式是___映射方式。(中国科学院大学 2015)_命中率高且电路实现简单的cache内存映射方式

Unhandled exceptions: java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException_unhandled exceptions: java.lang.instantiationexcep-程序员宅基地

文章浏览阅读3.2k次。可能是没有异常处理,只需要加上throws Exception就解决问题了。_unhandled exceptions: java.lang.instantiationexception, java.lang.illegalacc

webview ERROR_UNSUPPORTED_SCHEME ,errorcode=-10问题处理-程序员宅基地

文章浏览阅读1.5k次。webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { try{ if(url.startsWith("baidumap://")){ Intent _error_unsupported_scheme

embed标签-程序员宅基地

文章浏览阅读66次。Embed  (一)、基本语法:  embed src=url  说明:embed可以用来插入各种多媒体,格式可以是 Midi、Wav、AIFF、AU、MP3等等, Netscape及新版的IE 都支持。url为音频或视频文件及其路径,可以是相对路径或绝对路径。  示例:<embed src="your.mid">  (二)、属性设置:  1、自动播放...

php 上传文件漏洞,PHP -- 文件包含、文件上传漏洞-程序员宅基地

文章浏览阅读330次。PHP -- 文件包含、文件上传漏洞PHP -- 文件包含、文件上传漏洞文件包含文件引入漏洞,是由一个动态页面编译时引入另一个文件的操作。文件引入本身是没有问题,它是用于统一页面风格,减少代码冗余的一种技术。但是在特定的场景下就会形成漏洞jsp:include指令和include动作,其中include动作用于引入动态文件php:include(),include_once(),require()..._php文件上传4漏洞

配置NGINX同时运行 https 和 http_nginx 和 http无法同时启动-程序员宅基地

文章浏览阅读406次。SSL 是需要申请证书的,key和PEM文件要放到服务器路径。然后NGINX下要进行443端口和80端口的绑定。server { listen 80; server_name ietaiji.com www.ietaiji.com; root "D:/aaa/WWW/ietaiji"; index index.html_nginx 和 http无法同时启动