正则表达式

正则表达式

正则表达式分为两类
1基本正则表达式
2扩展正则表达式
vim, less,grep,sed,awk, nginx,mysql 等都支持正则表达式

正则表达式元字符

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

正则表达式次数匹配

用在要指定次数的字符后面,用于指定前面的字符要出现的次数
*匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次,即:可有可无
\+ 匹配其前面的字符至少1次,即:肯定有
\{n} 匹配前面的字符n次
\{m,n} 匹配前面的字符至少m次,至多n次
\{,n} 匹配前面的字符至多n次
\ {n,} 匹配前面的字符至少n次

  * r*t代表r字符可以出现0次或无数次
  * r.*t代表r和t之间可以出现任意长度的任意字符
  * r\\?t代表可以出现rt或t
  * r\\+t代表r必须出现一次以上  
  后面同理  

位置锚定

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

^行首锚定,用于模式的最左侧
行 尾 锚 定 , 用 于 模 式 的 最 右 侧 P A T T E R N 行尾锚定,用于模式的最右侧 ^PATTERN PATTERN用于匹配整行
^$代表空白
<或\b词首锚定,用于单词模式的左侧
>或\b词尾锚定,用于单词模式的右侧
匹配整个单词

^root表示以root开头的行  
root$表示以root结尾的行
^root$表示整行出现一个root  

分组其他

分组:()将一个或多个字符捆绑在一起,当作一个整体处理,如:(root)+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1,\2, \3, …\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
(string1(string2))\1:string1(string2)\2:string2

正则表达式练习

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)

[root@centos7|62|~]#cat /proc/meminfo | egrep '^(S|s)' 
SwapCached:            0 kB
SwapTotal:       4194300 kB
SwapFree:        4194300 kB
Shmem:             12712 kB
Slab:             101356 kB
SReclaimable:      57220 kB
SUnreclaim:        44136 kB

2、显示/etc/passwd文件中不以/bin/bash结尾的行

cat /etc/passwd | grep -v 'bin/bash$'

3、显示用户rpc默认的shell程序

cat /etc/passwd | grep 'wang' | cut -d: -f7

4、找出/etc/passwd中的两位或三位数

cat /etc/passwd | egrep '\<[0-9]{2,3}\>' -o

5 显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行

cat  /etc/grub2.cfg |egrep ^[[:space:]][^[:space:]].*$

6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行

netstat -tan | grep ".*LISTEN[[:space:]]\+

7、显示CentOS7上所有UID小于1000以内的用户名和UID

cat /etc/passwd |cut -d: -f1,3 | egrep '\<[0-9]{,3}\>' | tr -d :

8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell 同名的行

[root@centos7|121|~]#cat /etc/passwd | egrep '^([[:alpha:]].*):.*\1$'  
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

9,利用df和grep,取出磁盘各分区利用率,并从大到小排序

df | grep '^/dev/sda'| egrep -o '\<[0-9]{1,2}\>%' |sort -nr


1,显示三个用户root,test,noob的UID和默认shell

cat /etc/passwd | egrep '^(root|test|noob)'|cut -d: -f1,3,7

2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

cat /etc/rc.d/init.d/functions | egrep '^([[:alpha:]_]+)\(\)'

3,使用egrep取出/etc/rc.d/init.d/functions中其基名

echo "/etc/rc.d/init.d/function" | egrep -o '[^/]+$'

4、使用egrep取出上面路径的目录名

echo "/etc/rc.d/init.d/function" | egrep -o '.*/'

5、统计last命令中以root登录的每个主机IP地址登录次数

last | egrep '^root.*([0-9].){3}[0-9]{3}'|tr -s ' '|cut -d' ' -f3|sort|uniq -c |sort -nr

6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

\<[0-9]\>\<1[0-9]\>\<1[0-9][0-9]\>\<2[0-4][0-9]\>\<25[0-5]\>

7、显示ifconfig命令结果中所有IPv4地址

ifconfig | egrep '([0-9]{1,3}\.){3}[0-9]+' -o

8、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面

echo "welcome to magedu linux"| tr -d ' '|grep -o '.'|sort|uniq -c |sort -nr

你可能感兴趣的:(正则表达式)