GNU/Linux平台上正则表达式的简单使用

友情提醒:本博文涉及的内容中涉及到的系统实践操作在Centos6.5上实现,GNU/Linux简称为linux,GNU/grep简称为grep,GNU/sed简称为sed,GNU/gawk简称为awk。

-------------------------------------------------楔子---------------------------------------------

小酒馆一角落,一胖三瘦围着方桌坐定,大快耳颐后正在唠嗑。

瘦子甲:“胖子,为什么要把正则表达式和linux联系在一起?”

胖子:“因为下面的内容是在linux平台上正则表达式的简单使用。”

瘦子乙:“你认为linux平台上正则表达式很重要?”

胖子:“重要性无需质疑,linux的两大特性:①一切皆文件。②使用文本文件保存服务配置。就决定了正则表达式和它的三个好基友,grep/sed/awk的组合在处理文件搜索,替换,生成报告文件时,无往而不利。”

瘦子丙:“胖子,你再不开始讲正题,这顿饭你请。”

胖子:“容我在啰嗦一句,linux上正则表达式的使用,是个被写烂的题材,下文若有雷同,纯属巧合,牛人请自闪,约架请先向公安备案。”

----------------------------------正文----------------------------------------------

请先允许我简要介绍下grep这个工具,不然正则表达式没法演示。

1. Grep是个搜索工具,可根据使用者定义的PATTEN,逐行搜索文本或者管道传递的数据,若行中有匹配PATTEN模式的字符串,则该行被打印出来(grep默认行为)。这个PATTEN可以是字符串,或者是使用正则表达式元字符组合的模式。

例如:在/etc/password文件中搜索含有root字符串的行。

[[email protected] test]$ grep --color=auto ‘root‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] test]$

看是不是很方便的就将含有root字符串的行搜索出来了?!

2.grep的语法格式:

grep [option] ‘PATTEN‘ [FILE...]

常用选项:

--color=auto :使用该选项可使匹配的字符串变色显示。

-E:使用扩展的正则表达式。

-o: 只显示行中匹配到模式的字符串,而不显示其他的内容。

-v:反向显示,显示那些不含匹配模式字符串的行。

-i:匹配时忽略字符大小写。

-B #:#是数字,显示匹配的行及改行上面的#行。

-C #:#是数字,显示匹配的行及改行上下的#行。

-A #:#是数字,显示匹配的行及改行下面的#行。

*其它的选项请自行使用$man grep 查看。

*模式PATTEN建议使用‘‘ 号或者""号括起来

举例:

生成测试文件及内容:

[[email protected] test]$ cat<<EOF>t1file.txt
> who are you?
> My name is Brad Pitt.
> Your phone number is:135456789
> yes,sir
> EOF

[[email protected] test]$

2.1)显示grep默认行为:搜索含有you字符串的行

[[email protected] test]$ grep ‘you‘ t1file.txt
who are you?
[[email protected] test]$

默认情况下只显示了含有you的行,不含有you字符串的行不显示,且you没有变色。

2.2)实行匹配字符串变色显示:搜索含有you字符串的行

[[email protected] test]$ grep --color=auto ‘you‘ t1file.txt
who are you?
[[email protected] test]$
这下看的可以明显清晰易辨别。

2.3)忽略字符大小写:搜索含有you字符串的行

[[email protected] test]$ grep -i --color=auto ‘you‘ t1file.txt
who are you?
Your phone number is:135456789
[[email protected] test]$

使用选项-i后,搜索范围又一步加大了。

2.3)测试-v:搜索不含有you字符串的行

[[email protected] test]$ grep -v -i ‘you‘ t1file.txt
My name is Brad Pitt.
yes,sir
[[email protected] test]$

[[email protected] test]$ grep -v ‘you‘ t1file.txt
My name is Brad Pitt.
Your phone number is:135456789
yes,sir
[[email protected] test]$

为了让看得清使用的选项个数,这里没有将-v和-i合并使用。

2.4)测试下选项 -C#:显示含有name字符串行,及该行上下各1行

[[email protected] test]$ grep -C1 --color=auto ‘name‘ t1file.txt
who are you?
My name is Brad Pitt.
Your phone number is:135456789
[[email protected] test]$

-A#,-B#同-C#使用方式没有区别,这里就不测试了。

2.5)测试-E选项:含有字符串you或者You的行

[[email protected] test]$ grep -E --color=auto ‘(y|Y)ou‘ t1file.txt
who are you?
Your phone number is:135456789
[[email protected] test]$

3.正则表达式

正则表达式,又称:Regular Expression,RE。计算机科学中的一个概念,它由一堆元字符组成,
再配合人类的思维,可以使用有限的元字符组合,表达一系列符合某些语法模式的字符串,在文本处理
领域中可用来检索,借助其他工具替换符合模式的字符,并按照一定的预设格式显示出来。

正则表达式分为:基本正则表达式和扩展正则表达式。

基本正则表达式中元字符:

=======匹配字符,数字和符号=========

.:表示任意单个字符

[ ]:表示指定范围内的任意单个字符,例如:[0-9]表示0到9中任意单个数字

[^ ]:表示指定范围外的任意单个字符,例如:[^0-9]表示非数字的任意单个字符

[[:digit:]] :0到9数字中任一个

[[:lower:]] :小写字母中任一个

[[:upper:]] :大写字母中任一个

[[:alpha:]] :大小写字母中任一个

[[:alnum:]] :字母数字中任一个

[[:punct:]] :标点符合中任一个

[[:space:]] :任一空白字符

=======匹配字符出现的次数===========

\*:左边的字符出现任意次

\?:左边的字符出现0次或1次

\+:左边的字符出现至少1次

\{m,n\}:左边的字符出现m到n次

\{m,\}:左边的字符出现至少m次

\{0,n\}:左边的字符出现至多n次

=======锚定位置=======================

^:表示右边的字符出现在行首

$:表示左边的字符出现在行尾

\< :表示右边的字符出现在单词首部,可使用\b代替

\> : 表示左边的字符出现在单词尾部,可使用\b代替

\<WORD\>:绝对匹配WORD的单词

========分组与引用====================

\(PATTEN\): PATTEN当作一个整体出现

\(P1\).....\1....:\1的位置出现一个同前边P1一模一样的字符

举例:

3.1)行首匹配符号^:显示/etc/passwd文件中root位于行首的行

[[email protected] test]$ grep --color ‘^root‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
[[email protected] test]$
             3.2)行尾匹配符$:显示/etc/passwd文件中bash位于行尾的行

[[email protected] test]$ grep --color ‘bash$‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
lijun:x:500:500:lijun,115,110,119:/home/lijun:/bin/bash

[[email protected] test]$

3.3)锚定词首符\< 锚定词尾符\> :在/etc/passwd 文件中显示包含以r开头,t结尾,中间2个任意字符的单词的行。

[[email protected] test]$ grep --color=auto ‘\<r..t\>‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] test]$

3.4)显示.与*的组合使用以及贪婪模式: 在/etc/passwd 文件中显示包含以r开头,t结尾,中间任意字符的单词的行。

[[email protected] test]$ grep --color=auto ‘\<r.*t\>‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] test]$

在显示的第一行中匹配那么长,是因为正则表达式的贪婪模式所致。

3.5)范围符号[]的使用:显示/proc/meminfo中以s开头的行

[[email protected] tt]# grep --color=auto ‘^[sS]‘ /proc/meminfo
SwapCached:            0 kB
SwapTotal:       1063928 kB
SwapFree:        1063928 kB
Shmem:               172 kB
Slab:             101220 kB
SReclaimable:      46408 kB
SUnreclaim:        54812 kB
[[email protected] tt]# grep -i  ‘^s‘ /proc/meminfo
SwapCached:            0 kB
SwapTotal:       1063928 kB
SwapFree:        1063928 kB
Shmem:               172 kB
Slab:             101228 kB
SReclaimable:      46412 kB
SUnreclaim:        54816 kB

3.6)分组和引用演示:搜索下面文档每行中均有以l开头,e结尾中间任意字符的单词,要求行首同行尾单词相同的行

[[email protected] tt]# cat 3.txt
she is my love,isn‘t your love
I like her leg,but she is your love
she is not my love,but her phone as my like
I like dog,but she like cat

[[email protected] tt]# grep --color ‘\(\<l..e\>\).*\1‘ 3.txt
she is my love,isn‘t your love
I like dog,but she like cat

行中的那些非l开头e结尾的单词被模式.*匹配无法除去

扩展的正则表达式:

使用扩展正则表达式使用grep -E 或者 egrep

=======匹配字符,数字和符号=========

与基本正则表达式相同

=======锚定位置=======================

与基本正则表达式相同

=======匹配字符出现的次数===========

*:左边的字符出现任意次

?:左边的字符出现0次或1次

+:左边的字符出现至少1次

{m,n}:左边的字符出现m到n次

{m,}:左边的字符出现至少m次

{0,n}:左边的字符出现至多n次

========分组与引用====================

(PATTEN): PATTEN当作一个整体出现

(P1).....\1....:\1的位置出现一个同前边P1一模一样的字符

========选择======================

a|b:表示a或者b

例子:

3.7)写个模式匹配下列邮件地址:

[[email protected] tt]# cat 2.txt
[email protected]
[email protected]
[email protected]
[email protected] is j.com
This is my email:[email protected],and this is my http address:http://www.sina.com

[[email protected] tt]# grep -i -E --color=auto ‘\<[[:alnum:]]+(-|_){0,}[[:alnum:]]{0,}\>\@\<[[:alnum:]]+\>\.com‘ 2.txt
[email protected]
[email protected]
[email protected]
[email protected] is j.com
This is my email:[email protected],and this is my http address:http://www.sina.com
[[email protected] tt]#

3.8)写个模式匹配ifconfig eth1中出现的数字:

[[email protected] tt]# ifconfig eth1|grep --color=auto -E ‘[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]‘
eth1      Link encap:Ethernet  HWaddr 00:0C:29:97:01:8B  
          inet addr:172.16.200.2  Bcast:172.16.200.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe97:18b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12535 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4685 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1144613 (1.0 MiB)  TX bytes:569776 (556.4 KiB)
[[email protected] tt]#

3.9)写个模式匹配ifconfig eth1中出现的ip地址和掩码

[[email protected] tt]# ifconfig eth1|grep --color=auto  -E ‘(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>‘
          inet addr:172.16.200.2  Bcast:172.16.200.255  Mask:255.255.255.0

好吧,就这些了,上面就是常用到的正则表达式和grep的用法,更详细的请通过书籍,互联网等查询学习。

感谢老婆送的棒棒糖,让我支撑这写完这篇文章。

----------------------------------小结-----------------------------------------------

说完上面这些,胖子瞟了一眼在座的3个同伴,看着他们发发蔫的眼神,胖子心中想到:这比诱惑术还好用?下次大餐时,该多准备些awk,sed配合正则表达式的用法,这样以来就不用自己买单了,嘎嘎。

便向店小二喊道:“座上的3个吃完买单”。变抽身翩然而去。

时间: 2024-10-19 03:03:35

GNU/Linux平台上正则表达式的简单使用的相关文章

Linux平台上的多种软件安装方式与更友好的包管理软件介绍

一.Linux平台上软件安装卸载的四种方式 1.源码包安装.卸载 优点:性能最好,稳定 缺点:安装稍微复杂,容易出错 一般软件的源码包都进行了压缩,压缩的格式分为gz和bz(或bz2)两种格式. 源码包的格式:***.tar.gz(或bz,bz2). 如下图所示,是PHP的源码包: 源码包(以PHP的安装包为例)的安装.卸载的方法如下: 1)安装: 第一步:解压安装包 gz后缀用:tar -zxvf php-5.5.14.tar.gz bz(或bz2)后缀用:tar -jxvf php-5.5.

[Python 学习] 二、在Linux平台上使用Python

这一节,主要介绍在Linux平台上如何使用Python 1. Python安装. 现在大部分的发行版本都是自带Python的,所以可以不用安装.如果要安装的话,可以使用对应的系统安装指令. Fedora系统:先以root登入,运行 yum install python Ubuntu系统:在root组的用户, 运行 sudo apt-get install python 2. 使用的Python的脚本 Linux是一个以文件为单位的系统,那么我们使用的Python是哪一个文件呢? 这个可以通过指令

PHP开发环境的配置(Linux平台上安装Apache和PHP)

PHP开发环境的配置(Linux平台上安装Apache和php): 下载Apache (httpd-2.4.12.tar.gz).下载PHP(php-5.6.9.tar.gz).下载与PHP安装相关的libxml2(libxml2-2.7.8.tar.gz).下载与Apache安装相关的三个文件:apr(apr-1.5.2.tar.gz).apr-util(apr-util-1.5.4.tar.gz).pcre (pcre-8.10.zip) (1)安装Apache:在安装apache之前必须先

使用Samba服务器由win平台向linux平台上传文件

1.配置yum [[email protected] /]# cd /etc/yum.repos.d/ [[email protected] yum.repos.d]# vi yum.repo --修改光盘挂载位置,enabled设置为启动 配置yum参考链接:yum配置举例 2.构建samba服务器 [[email protected] /]# yum install -y samba-* --使用yum安装samba服务器 [[email protected] /]# service smb

windows平台是上的sublime编辑远程linux平台上的文件

sublime是个跨平台的强大的代码编辑工具,不多说. 想使用sublime完成linux平台下django站点的代码编辑工作以提高效率(原来使用linux下的vim效率较低,适合编辑一些小脚本). 下载linux平台下的Sublime_Text_2.0.2_x64.tar.bz2(http://www.sublimetext.com/) 解压使用: tar -xjvf Sublime_Text_2.0.2_x64.tar.bz2 cd Sublime\ Text\ 2/ 执行 ./sublim

记一次在linux 平台上的优化调试

Author:DriverMonkey Mail:[email protected] Phone:13410905075 QQ:196568501 测试平台:AM335X 优化前状态:采样速度  105次/S 优化目标:速度为 130次/S 以上(注:根据ADC的采样率理论上可以达到 330次/S) 优化步骤: 1)代码框架可分为四大模块(UI, 业务逻辑管理,设备管理,远程管理)共10个线程 模块间有项目依赖关系,不能一下全部停掉,先去掉一些辅助功能线程(如:按键扫描线程,远程命令处理线程等)

Linux平台上实现队列

转载: http://my.oschina.net/sundq/blog/203600 Linux上目前有两种事件通知方式,一种是线程条件变量,一种是利用eventfd实现事件通知,下面介绍一下利用这两种方法实现异步队列的方法. 线程条件变量 相关函数介绍 pthread_cond_init:初始化一个线程条件变量. pthread_cond_wait:等待条件触发. pthread_cond_signal:通知一个线程,线程条件发生. pthread_cond_timedwait:等待条件触发

在Linux平台上部署openvpn

部署openvpn openvpn虚拟专用通道 认证方式:证书认证 实验环境: openvpn_server 2块网卡     redhat6.5           内网:192.168.1.10 外网:172.16.16.172 局域网内主机               redhat6.5            ip:192.168.1.100 openvpn_client             win7              ip:172.16.16.173 gateway:172.

VS2017开发Linux平台上的程序

重装系统后安装VS2015时卡住了,于是试试看VS2017怎样,听说还支持调Linux.发现VS2017跟12/13/15又有了新的飞跃,竟然支持模块化下载,对于我这种主要写C++简直是个福音,勾了Linux C++和MFC后,C盘+D盘也才6G,比起VS2015只额外勾MFC就有10G来说轻了这么多! VS2017只有在线安装包,寝室里下载不到10分钟就搞定了,迫不及待地新建项目 哇擦,终于没有了微软地一堆.NET系列了! 然后现在就开始配置跨平台Linux开发环境,按照官网教程 https: