已整理-Linux正则表达式

 

目录:

  1、基本正则表达式

  2、扩展正则表达式

  3、示例

 

1、基本正则表达式
1.1、字符匹配

.             匹配任意单个字符,不含空格
[]             匹配指定范围内的任意字符,如:[a-z]、[A-Z]、[0-9]
[^]            匹配指定范围外的任意单个字符,取反
[:alnum:]        字母和数字,与[A-Za-z0-9]等价
[:alpa:]         字母,与[A-Za-z]等价
[:digit:]        数字,与[0-9]等价
[:xdigit:]       十六进制字符,与[0-9A-Fa-f]等价
[:blank:]        空格和制表符
[:lower:]        小写字母
[:upper:]        大写字母
[:space:]        空白字符,等价于[\t\r\n\v\f]
[:punct:]        标点符号

 

1.2、匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数;

*          贪婪模式, 匹配*号前面的字符任意次,仅表示次数: 0 次或多次(>=0次), 与匹配文件的通配符意义不一样
.*          任意长度的任意字符,含空格
\?          匹配其前面的字符0或1次,即前面的字符可有可无
\+          匹配其前面的字符至少1次
\{m,n\}       匹配至少m次,最多n次
\{m\}        匹配前面的字符m次
\{m,\}       匹配前面的字符至少m次,多则不限

 

1.3、位置锚定

^            行首锚定, 如:^root
$            行尾锚定, 如:bash$
^PATTERN$       用于模式匹配整行,如: ^$ 表示空间

\<或\b         词首锚定,用于单词模式的左侧
\>或\b         词尾锚定,用于单词模式的右侧
\<PATTERN\>      匹配整个单词

 

1.4、分组

\(\)    将1个或多个字符捆绑在一起,当做一个整体进行处理,如: \(xy\)*ab

分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3....
\1      从左侧起,第1个左括号以及与之匹配右括号之间的模式所匹配到的字符

 

后向引用分组:
引用前面的分组括号中的模式所匹配字符, 而非模式本身

 

2、扩展正则表达式
2.1 元字符字符匹配

.          匹配任意单个字符,不含空格
[]         匹配指定范围内的任意字符,如:[a-z]、[A-Z]、[0-9]
[^]        匹配指定范围外的任意单个字符,取反

 

2.2 次数匹配

*          贪婪模式, 匹配*号前面的字符任意次,仅表示次数: 0 次或多次(>=0次), 与匹配文件的通配符意义不一样
?          匹配其前面的字符0或1次,即前面的字符可有可无
+          匹配其前面的字符至少1次
{m}         匹配前面的字符m次
{m,n}        匹配至少m次,最多n次

 

2.3 锚定

^          行首锚定, 如:^root
$          行尾锚定, 如:bash$
\<,\b        词首锚定,用于单词模式的左侧
\>,\b        词尾锚定,用于单词模式的右侧

 

2.4 分组
()

 

2.5 或者表示

a|b      a或b
C|cat     C或cat

 

 3、示例

3.1 显示/proc/meminfo 文件中以大小s开头的行,要求:使用2种方式实现

# cat /proc/meminfo |grep '^[Ss]'
# cat /proc/meminfo |egrep '^(S|s)'

 

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

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

 

3.3 显示/etc/passwd 文件中ID号最大的用户的用户名;

# grep `cat /etc/passwd |cut -d : -f 3|sort -rn|head -1` /etc/passwd
# sort -t: -k3 -n /etc/passwd|tail -1|cut -d: -f1

 

3.4 如果用户root存在,显示其默认的shell程序;

# grep '^root\b' /etc/passwd &> /dev/null && grep "^root\b" /etc/passwd|cut -d: -f7

 

3.5 找出/etc/passwd 中的2位或3位数;

# grep '\<[0-9]\{2,3\}\>' /etc/passwd

 

3.6 显示/etc/rc.d/rc.sysinit 文件中,至少以一个空白字符开头的且后面存在非空白字符的行;

# grep '^[[:space:]]\+[^[:space:]]' /etc/grub2.cfg        #centos 7 没有/etc/rc.d/rc.sysinit 这个文件

 

3.7 找出"netstat -tan"命令的结果中以'LISTEN'后缀0、1或多个空白字符结尾的行;

# netstat -tan|grep "LISTEN[[:space:]]*$"

 

3.8 添加用户bash 、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;

# useradd bash
# useradd basher
# useradd testbash
# useradd -s /sbin/nologin nologin
# grep '^\([[:alnum:]]\+\>\).*\1$' /etc/passwd

 

3.9 匹配ip地址

# ip addr |egrep -o '([0-9]+\.){3}[0-9]+'

 

3.10 显示当前系统root、centos或user1用户的默认shell和UID

# grep -E '^\<(root|centos|user1)\>' /etc/passwd

 

3.11 找出/etc/rc.d/init.d/functions文件(centos 6)中某单词后面跟一个小括号的行;

# egrep '[[:alpha:]]+\(.*\)' haha.txt

 

3.12 使echo 输出一个路径,使用egrep取出其基名(类似于basename命令);

# echo '/mnt/sdc/' |egrep -o "[^/]+/?$"|cut -d"/" -f1

 

3.13 找出ifconfig命令结果中1-255之间的数值;

# ifconfig |egrep '\<[1-9]{1}([0-9]{0,2})\>'

 

posted on 2022-10-20 09:42  tengq  阅读(2017)  评论(0编辑  收藏  举报

导航