在介绍正则表达式之前,必须先解释下与linux通配符的关系。通配符代表的是bash操作接口的一个功能,而正则表达式是一种字符串处理的表达方式。
基本的正则表达式:
元字符:
. :匹配任意多个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:digit:]、[:alpha:]、[:alnum:]、[:lower:]、[:upper:]、[:space:]、[:punct:]
匹配次数:
* :匹配其前面的字符任意次
\? : 匹配其前面的字符0次或者1次
\{m,n\}:匹配其前面的字符最少m次,最多n次
位置锚定:
^:此字符后面的任意内容必须出现在行首
$ : 此字符前面的任意内容必须出现在行尾
^$ 空白行
\<或\b :锚定词首,此字符后面的任意内容必须出现在行首
\>或\b:锚定词尾,此字符前面的任意字符必须作为单词的尾部出现
分组:\(\) 例如 \(ab\)*,这里存在一个后向引用的问题\1引用第一个左括号以及与之对应的右括号所包括的所有内容 \2、\3以此类推。
扩展正则表达式:
元字符:没有区别 . 、[]、[^]、以及类似的集合文件:[:digit:]、[:alpha:]、[:upper:]、[:lower:]、[:alnum:]、[:space:]
次数匹配:*、?
不同之处:+ 匹配其前面的字符1次或者多次
{m.n}:这里不需要加'\'
位置锚定:^$ \< \>
不同之处:分组:() \1, \2, \3
或者|: or
grep:
扩展的是egrep = grep -e
grep [options] PATTERN [FILE...]
-i 忽略大小写 --color -v显示没有没模式匹配到的行 -o只显示被模式匹配到的字符串
-E 使用扩展正则表达式 -A# :列出该行以后的#行 -B#:列出该行以前的#行 -C#:列出该行前后的#行
此前我已经在本地目录下alias grep='grep --color' ,然后source .bashrc
1.查找/proc/meminfo文档中以字母s开头的文档,不区分大小写
grep -i '^s' /proc/meminfo
2.显示/etc/passwd文档中以/sbin/nologin结尾的行
grep '/sbin/nologin$' /etc/passwd
3.取出默认shell为bash,且其用户ID号最小的用户的用户名
grep '.*bash$' /etc/passwd | sort -n -t : -k3 | cut -d : -f1 | head -n 1
4. 显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行
grep ':[[:digit:]]:' /etc/inittab
5.显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
grep '^[[:space:]]\{1,\}' /boot/grub/grub.conf
6.显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行
grep '^\([[:digit:]]\).*\1$' /etc/inittab
7.显示/proc/cpuinfo文件中的一位数和两位数
grep -E '[[:digit:]]{1,2}' /proc/cpuinfo
8.找出ifconfig命令结果中1-255之间的整数
ifconfig | grep -E '\<([[:digit:]]|[1-9][[:digit:]]|1[[:digit:]]{2}|2[0-4][[:digit:]]|25[0-5])\>'
9.分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现在数字必须相同),请写出可以精确找到类似两行的模式:
l1:1:wait:/etc/rc.d/rc 1
l3:3:wait:/etc/rc.d/rc 3
grep '^l\([[:digit:]]\):\1.*\1$' /etc/inittab