正则表达式是linux中重要的一部分,学习正则表达式先要学好grep和egrep的命令使用。
1. grep:
grep命令的基本语法格式
grep [OPTION]... 'PATTERN' FILE...
grep的常用选项:
-v : 对匹配的行进行取反
-o : 仅显示匹配到的内容
-i : 忽略字符大小写
-n : 为匹配的行加上行号
-E : 使用扩展正则表达式 ,等同于egrep命令
-F : 不使用正则表达式搜索,等同于fgrep命令
-A # : 连同匹配行的下#行一并显示,#代表任意数字
-B # : 连同匹配行的上#行一并显示,#代表任意数字
-C # : 连同匹配行的上下#行一并显示,#代表任意数字
--color=auto : 对匹配的内容以不同的颜色显示
用 grep命令查找 /etc/passwd 文件中 含有 “halt” 字符串的行
使用-v选项,进行反应查找的效果
-o:只显示匹配到的内容
没有使用-o选项的效果:
使用-0选项的效果:
-i:忽略大小写
-n : 为匹配的行加上行号
2.基本正则表达式元字符
(1)字符匹配
. : 匹配任意单个字符
. * :表示匹配任意长度的任意字符
\+:匹配前面的字符至少1次
\? : 匹配其前面的字符出现0次或1次的行
\{m\} : 匹配其前面的字符出现m次的行
\{m,n\} : 匹配其前面的字符至少出现m次,至多出现n次的行,m和n表示一个范围m-n
\{0,n\}:至多n次
[] : 表示匹配范围内任意单个内容
常用的集合表示方法有:
纯数字:[[:digit:]]或[0-9]
小写字母:[[:lower:]]或[a-z]
大写字母:[[:upper:]]或[A-Z]
大小写字母:[[:alpha:]]或[a-zA-Z]
数字加字母:[[:alnum:]]或[0-9a-zA-Z]
空白字符:[[:space:]]
标点符号:[[:punct:]]
例子1:匹配包含数字0或2的行
例子2:匹配包含字母a或b的行
例子3:匹配包含数字0-9的行
3.位置锚定:
^:行首锚定;用于模式的最左侧,^PATTERN
$:行尾锚定;用于模式的最右侧,PATTERN$
^PATTERN$:要让PATTERN完全匹配一整行;
^$:空行;
^[[:space:]]*$:
单词:由非特殊字符组成的连续字符(字符串)都称为单词;
^ : 行首锚定
$ : 行尾锚定
^$ : 匹配空白行
\< : 词首锚定
\> : 词尾锚定
\<\> : 匹配单词
分组:
\(\)
\(ab\):表示ab整体作为匹配字符
\(ab\)* : 表示ab整体作为匹配字符,且匹配任意次
\(ab\)\{1,\}:表示ab整体作为匹配字符,且匹配至少一次
分组还可以后向引用
\1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
\2: 引用第一个左括号以及与之对应的右括号所包括的所有内容
\3: 引用第一个左括号以及与之对应的右括号所包括的所有内容
举例:有文本文件如下内容:
He love his lover.
He like his lover.
He love his liker.
He like his liker.
grep "\(l..e\).*\1r" ttt.txt 表示匹配结果如下:
2.egrep:
支持使用扩展正则表达式的grep命令,相当于grep -E;
egrep [OPTIONS] PATTERN [FILE...]
扩展正则表达式的元字符:
字符匹配:
.:任意单个字符
[ ]:范围内的任意单个字符
[^ ]:范围外的任意单个字符
匹配次数:
*:任意次;
?:0次或1次;
+:1次或多次;
{m}:匹配m次;
{m,n}:至少m次,至多n次;
{0,n}
{m,}
位置锚定:
^:行首
$:行尾
\<, \b:词首
\>, \b:词尾
分组及引用:
(pattern):分组,括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中;
后向引用:\1, \2, ...
或者:
a|b:a或者b
C|cat:表示C或cat
(C|c)at:表示Cat或cat
3.练习:
(1).显示/proc/meminfo文件中以大写或小写s开头的行;
# grep -i '^s' /proc/meminfo
(2).显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
# grep -v '/sbin/nologin$' /etc/passwd | cut -d: -f1
(3).显示/etc/passwd文件中其默认shell为/bin/bash的用户
进一步:仅显示上述结果中其ID号最大的用户
# grep '/bin/bash$' /etc/passwd | cut -d: -f1 | sort -n -r | head -1
(4).找出/etc/passwd文件中的一位数或两位数;
# grep '\<[[:digit:]]\{1,2\}\>' /etc/passwd
(5).显示/boot/grub/grub.conf中至少一个空白字符开头的行
# grep '^[[:space:]]\+.*' /boot/grub/grub.conf
(6).显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的 行;
# grep '^#[[:space:]]\+[^[:space:]]\+' /etc/rc.d/rc.sysinit
(7).找出netstat -tan命令执行结果中包含'LISTEN'的行;
# netstat -tan | grep 'LISTEN[[:space:]]*$
(8).显示当前系统上root、centos或user1用户的默认shell及用户名;
# grep -E '^(root|centos|user1\>)' /etc/passwd
(9).找出/etc/rc.d/init.d/functions文件中某单词后面跟一对小括号'()"的行;
# grep -o '\<[[:alpha:]]\+\>()' /etc/rc.d/init.d/functions
(10).使用echo输出一个路径,而使用egrep取出其基名;
# echo /etc/rc.d/ | grep -o '[^/]\+/\?$' | grep -o '[^/]\+'