linux基础之正则表达式

基本正则表达式元字符

字符匹配

.   匹配任意单个字符,可以是一个汉字
[]   匹配指定范围内的任意单个字符,示例:[wang]   [0-9]   [a-z]   [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^wang] 
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围
广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S     #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s     #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意
Unicode 正则表达式会匹配全角空格符

范例:

筛选/etc目录下以0-6结尾的rc文件 
[root@192 /]# ls /etc/ | grep 'rc[0-6]'
筛选/etc目录下带0-6后面跟任意字符的文件
[root@192 ~]# ls /etc/ | grep "rc[.0-6]."
筛选/etc目录下带0-6.的文件或目录
[root@192 ~]# ls /etc/ | grep 'rc[.0-6]\.'

匹配次数

用在要指定次数的字符后面,用于指定前面的字符要出现的次数

* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\}  #匹配前面的字符至多n次,<=n
\{n,\}  #匹配前面的字符至少n次

范例:

 获取网卡IP地址
[root@192 data]# ifconfig ens33 | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"| head -n1

位置锚定

位置锚定可以用于定位出现的位置

^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
^$ #空行
^[[:space:]]*$ #空白行
\< 或 \b   #词首锚定,用于单词模式的左侧
\> 或 \b        #词尾锚定,用于单词模式的右侧
\<PATTERN\>     #匹配整个单词

##扩展正则表达式元字符

() 分组
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

范例

显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
[root@192 ~]# grep '^\(S\|s\)' /proc/meminfo
[root@192 ~]# grep -v '^[^Ss]' /proc/meminfo 

显示/etc/passwd文件中不以/bin/bash结尾的行
[root@192 ~]# grep  '/bin/bash$' /etc/passwd

显示用户rpc默认的shell程序
[root@192 ~]# grep  '^rpc' /etc/passwd | cut -d: --output-delimiter="--" -f1,7

找出/etc/passwd中的两位或三位数
[root@192 ~]#grep -E '\<[0-9]{2,3}\>' /etc/passwd

显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行
[root@192 ~]# grep '^[[:space:]]\+\S' /etc/grub2.cfg

找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行
[root@192 ~]# netstat  -tan|grep '\<LISTEN\>[[:space:]]\+$'

显示CentOS7上所有UID小于1000以内的用户名和UID
cat /etc/passwd|cut -d: -f1,3| grep '\<[0-9]\{1,3\}\>$'| sort -t: -k2 -n

添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行	
[root@192 ~]# cat /etc/passwd | grep -E '^([[:alnum:]]*\>).*\1$'

利用df和grep,取出磁盘各分区利用率,并从大到小排序	
[root@192 ~]# df |grep -o '[0-9]\+%'| sort -nr

扩展正则表达式元字符

字符匹配

. 任意单个字符
[wang] 指定范围的字符
[^wang] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

次数匹配

*   匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次

位置锚定

^ 行首
$ 行尾
\<, \b 语首
\>, \b 语尾

分组其它

() 分组
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

范例:

显示三个用户root、rpc、vash的UID和默认shell
[root@192 ~]# cat /etc/passwd | cut -d: -f1,3,7 | grep -wE "^root|^rpc|^bash"

找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
[root@192 ~]# cat /etc/rc.d/init.d/functions | grep "^.*\>()"

使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@192 ~]# echo "/etc/rc.d/init.d//functions" | egrep -o "[^/]+$"

使用egrep取出上面路径的目录名
[root@192 ~]# echo "/etc/rc.d/init.d//functions" | egrep -o "[^/]+\>"

统计last命令中以root登录的每个主机IP地址登录次数
[root@192 ~]# last | grep "^root"| egrep -o "([0-9]{1,3}.){3}[0-9]{1,3}" | sort -nr |uniq -c|sort -n

利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
seq 255 | egrep -o '([0-9]$|[1-9][0-9]$|1[0-9]{2}|2[0-4][0-9]|25[1-5])' | sort -n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨煮夕阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值