文本搜索工具:Grep及正则表达式

  1. globbing:文件名通配,即限定时间,又限定次数;

*:匹配任意长度的任意字符;

?:匹配任意单个字符;

[]:指定范围内的任意单个字符;[a-z],所有字母,不区分大小写;

[^]:指定范围外的任意单个字符

 

  1. grep命令: Globalsearch Regular expression and Print out the line

以行为单位进行文本处理

模式(pattern):以正则表达式的元字符和正常字符组成

grep [OPTIONS] PATTERN [FILE]…

           --color[=always,auto,never]

                    效果: grep –color=auto“root” /etc/passwd

                    aliasgrep=”grep –color=auto”,可以写到配置文件中,永久保存,位置 /etc/bahsrc

           -o:only,只显示被匹配到的行

           -i:ignore case,忽略大小写

           -v:显示不能被模式匹配到的行

 

           -E:使用扩展的正则表达式;

           -A #:after,显示匹配到的行及后面#行;

           -B #:before,显示匹配到的行及前面#行;

           -C#:context,显示匹配到的行及前后#

 

  1. 正则表达式:Regular EXPression REGEXP。默认工作在贪婪模式下,匹配所有能匹配到的内容,在数据量较大的情况下,速度较慢

  2. a)        基础正则表达式:grep

元字符:大部分需要转义

         字符匹配:

                   . :匹配任意单个字符;

                   []:匹配指定范围内的任意单个字符

                   [^]:匹配指定范围外的任意单个字符

                   字符集:

                            [0-9];[[:digit:]]:数字

                            [a-z];[[:lower:]]:小写字母;

                            [A-Z];[[:upper:]]:大写字母;

                            [[:space:]]:空格

                            [[:punct:]]:特殊字符

                            [0-9a-zA-Z],[[:alnum:]]:数字和字母

                            [a-zA-Z];[[:aipha:]]:所有字母

         次数匹配:

*:任意单个字符

.:       .* :任意字符

\?:匹配其前面字符0次或1次;

\+:匹配其前面字符1次或多次(至少一次);

\{m,n\}:匹配其前面字符至少m次,至多n次;

         \{m\}:精确匹配其前面字符m次;

         \{0,n\}:匹配其前面字符最少0次,最多n次;

         \{m,\}:匹配其前面字符最少m次;

         位置锚定:

                   ^:句子锚定,锚定句首

                   $:句子锚定,锚定句尾

                            ^PATTERN$:匹配整个句子

                            ^$:空白行

                   \<,\b:单词锚定,锚定词首【不属于转义】【\b位于词首,如\bro,以ro开头的单词】

                   \>,\b:单词锚定,锚定词尾,【不属于转义】【\b位于词尾,如ro\b,以ro结尾的单词】

                            \<PATTERN\>:精确匹配单词,

                            PATTERN\>:PATTERN结尾的单词;

                            \<PATTERN:以PATTERN开头的单词;

         分组及后向引用:

                   \(PATTERN\):分组,匹配整组字符;

                   \|:或者

                   \1,\2,\3…:后向引用,引用前面的第1,2,3个分组

练习:

1、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;

#grep –i“^s” /proc/meminfo

#grep “^[sS]” /proc/meminfo

2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
#grep –v “nologin$” /etc/passwd
3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
#grep “bash$” /etc/passwd
4、找出/etc/passwd文件中的一位数或两位数;
#grep “\<[0-9]{1,2}\>” /etc/passwd
#grep “\<[0-9][0-9]\?\>” /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、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
#Useradd bash
#Useradd testbash
#Useradd basher
#Useradd –s nologin nologin
#grep “^\([[:alnum:]\+]\>\).*\1$” /etc/passwd

 

  1. 扩展正则表达式:grep  -E;  egrep。不需要转义;

字符匹配:

         . :任意单个字符

         []:范围内的任意单个字符

         [^]:范围外的任意单个字符

次数匹配:

                                     *:任意单个字符任意次

                                     ?:01

                                     +:1次或多次

                                     {m,n}:至少m次,至多n

                                               {m}m

                                               {m,}:至少m

                                               {0,n}至多n

位置锚定:

                   ^:锚定句首

                   $:锚定句尾

                   \<,\b:锚定词首

                   \>,\b:锚定词尾

分组及后向引用:

         ():

         \1,\2,\3…:

         | :或者,两侧所有内容;

                                               abc|CbaèabcCba

                                               abc\CbaèabcbaabCba

练习:

1、显示当前系统上rootfedorauser1用户的默认shell

# grep -E"^(root|fedora|user1)\>" /etc/passwd | cut –d”:” -f7

 

2、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello()

# grep -o-E "\<[[:alnum:]]+\>()" /etc/rc.d/init.d/functions

 

3、使用echo命令输出一个绝对路径,使用grep取出其基名;扩展:取出其路径名

 

#ls /etc/init.d/*|egrep -o "\<[^/]+/?$"

4、找出ifconfig命令结果中的1-255之间数字;

#ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

 

5、挑战题:写一个模式,能匹配合理的IP地址;

  1. 0.0.1-- 239.255.255.255

#ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\>.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"

6、挑战题:写一个模式,能匹配出所有的邮件地址;

         #grep -o -E"\<([[:alnum:]]{0,}[[:punct:]]{0,}[[:alnum:]]{0,})@([[:alnum:]]{0,}[[:punct:]]{0,})\.([[:alnum:]]{0,}[[:punct:]]{0,})\>"

 

  1. fgrep:完全不支持正则表达式,只能匹配字符,但速度快。在文件较大,而且

不需要正则时,建议使用。