grep/egrep ((Extend)Global standard Research Expression Print out the line),grep/egrep是一种文本搜索工具,可以通过使用指定的通配符/正则表达式来实现文本搜索功能。下面我们就来说一说在grep中的正则表达式。
1、[ ] 指定范围内的任一字符,需要注意的是这里所匹配的只是中括号内的任意一个字符,比如[2$sdN7],只能匹配2、$、s、d、N、7这些中的一个。
eg: grep [2$sdN7] /rc.d/rc.sysinit
匹配并显示 /rc.d/rc.sysinit 文件中包含 [2$sdN7] 任意字符的行。
[0-9],指匹配包含0、1、、9的任意数字的行,也可以书写为 [[:digit:]]
[a-z],指匹配包含a、b、、z的任意字母的行,也可以书写为 [[:lower:]]
[A-Z],指匹配包含A、B、、Z的任意字母的行,也可以书写为 [[:upper:]]
[^],指匹配中括号给定字符之外的任意数字、字母或符号等
[[:alpha:]],指匹配所有的字母,等同于[[:lower:][:upper:]]、[a-z,A-Z]
[[:alnum:]],指匹配所有的字母加数字,等同于[[:lower:][:upper:][:digit:]]、[a-z,A-Z,0-9]
[[:space:]],指匹配并显示包含空格的行
[[:punct:]],指匹配并显示包含标点符号的行
以上所有对象都可以任意组合使用,将以上简单的对象根据需求进行正确的组合,并结合以下操作对象的符号,即可实现复杂的功能:
*:匹配*之前的对象任意次
eg:grep x*y /etc/passwd
可以匹配包含xxy、xy、y的所有的行
.*:匹配任意长度的任意字符
\?:匹配此符号前面的对象,且该对象只能出现1次或0次
\{m\}:匹配此符号前面的对象,且该对象只能出现m次
\{m,n\}:匹配此符号前面的对象,且该对象最少出现m次,最多出现n次
\{m,\}:匹配此符号前面的对象,且该对象至少出现m次
\{0,n\}:匹配此符号前面的对象,且该对象至多出现出现n次,匹配0次也将显示出来
以上对象需用“”双引号来进行引用(做变量换算需要使用“”)
除以上对象操作符之外还有一些位置锚定操作符
^:锚定行首
^VarChar
$:锚定行尾
VarChar$
^$:表示空白行
单词的位置锚定
\<char:锚定单词首
char\>:锚定单词尾
单词的锚定符号可以分开使用
分组:
\( \)
eg:\(ab\) 指匹配包含“ab“字符的行
引用:
\#
\1:后向引用,引用第一个分组所匹配的内容,来进行二次匹配
引用前面的第一个左括号以及与之对应的右括号中的模式匹配到的内容,意思是说前面出现一次,在\1这也要出现一次
“引用”只能和“分组”一起用
详细讲解了正则表达式,下面我们来讲一下egrep/grep的使用方法
格式:grep [options] 'PATTERF' file,默认只支持基本正则表达式,要匹配额外功能的字符用-E
选项:
--color 将被模式匹配到的字串以红色显示
-v:反向匹配,显示不能被模式匹配到的行
-o:仅匹配被模式匹配到的字串,而非整行
-i:不区分大小写,ignore-case
-E:支持扩展 egrep = grep -E
-A #:还显示模式下面的#行
-B #:还显示模式上面的#行
-C #:前后各显示#行
egrep与grep使用的方式大致相同,只是大部分正则表达式可以不使用“\“逃逸符号,详解如下:
egrep:使用扩展正则表达式来构建模式,相当于 grep -E
字符匹配:
.:任意单个字符
[ ]:指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
次数匹配
*:匹配器前面的字符任意次
?:匹配器前面的字符0或1次
+:匹配其前面字符至少一次
{m}:匹配其前面字符m次
{m,n}:至少m次,至多n次
{m,}:至少m次
{0,n}:只读n次
分组:
():分组
|:或者,ac|bc ac或者bc那个呢
区别分析:相应的次数匹配不再需要逃逸符号”\"(且不可添加),如:\{m\}可以写为{m}等,分组\( \)可以写为( )
而且新增 “|” “或者”与”+“”至少匹配一次“这两个操作符
注意:单词锚定符号 \< \>依然不可省略,切记。
除grep、egrep还有fgrep工具,但是fgrep不支持正则表达式,很少应用,故不再提及。
以下为笔者提供的正则表达式示例,以供参考:
1、显示/proc/meminfo文件中的以大小写s的开头的行
grep -i "^s" /proc/meminfo2、取出默认shell为非bash的用户
grep -v "bash$" /etc/passwd |cut -d: -f1
3、取出默认shell为bash的且其ID号最大的用户
grep "bash$" /etc/passwd |cut -d: -f1|sort -n -t: -k3|tail -1
4、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行
grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
5、显示/boot/grub/grub.conf中以至少一个空白字符的行
grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
6、查出/etc/passwd中一位数或两位数
grep --color=auto "\<[0-9]\{1,2\}\>" /etc/passwd
7、找出ifconfig命令结果中的1到255之间的整数
ifconfig |grep -E --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
8、查看当前系统上root用户的所有信息
grep “\<root\>”/etc/passwd
9、添加用户bash和testbash,而后找出当前系统上于其他用户名和默认shell相同的用户
grep “^\([[:alnum:]]\{1,\}\)\>.*\1$” /etc/passwd
10、找出netstat -tan命令执行的结果中以“LISTEN”或“ESTABLISHEN”结尾的行
11、取出当前系统上所有用户的shell,要求:每种shell中显示一次,且升序排序显示
metstat -tan |grep -E “(LISETN|ESTABLISHED)[[:space:]]*"
cut -d: -f7 /etc/passwd|sort -u