首页 > 代码库 > grep详解

grep详解

grep详解

简介:grep:(global search regular expression(RE))and  print out the line

文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行。



正则表达式:是一类字符所书写出来的模式(PATTERN)


模式分为:基本正则表达式和扩展正则表达式


元字符:不表示字符本身的意义,用于额外功能性的描述


基本正则表达式的元字符:元字符使用引号


grep格式:grep  [option] ‘PATTERN‘  file


grep选项:

    --color:把匹配到文本显示颜色,精确匹配

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

    -v:取反,不能被模式所匹配到的行

    -o:仅匹配被模式匹配到的字符串,而非整行

    -i:不区分字符大小写

    -C:被模式匹配到的上下各显示一行


其正则如下:


1、字符匹配:为了在不同国家的字符编码中保持一致性使用POSIX(The Portable Operating System Interface)增加了特殊的字符类,其内容如下,但要注意,使用字符匹配时只能做模糊匹配,不能够精确匹配,例如使用[[:upper:]]不仅能够匹配到单个的大写字符,还能匹配到小写字符,这是因为工作在贪婪模式下。


贪婪模式:尽可能长的去匹配

    .:任意单个字符

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

    [[:upper:]]:大写字符,同[A-Z]

    [[:lower:]]:小写字符,同[a-z]

    [[:digit::]]:数字,同[0-9]

    [[:alpha:]]:任意字符

    [[:alnum:]]:字母加数字

    [[:punct:]]:标点符号

    [[:space:]]:空白字符

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


2、次数匹配:用来指定匹配其前面的字符的次数

    *:任意次

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

    \?:0次或1次

    \{\m}:匹配m次

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

    \{m,\}:至少m次

    \{0,n\}:至多n次


3、位置锚定:用于指定字符出现的位置

    ^:锚定行首,^char

    $:锚定行尾,char$

    ^$:空白行


4、单词位置锚定:

    \<char:锚定词首,\bchar

    char\>:锚定词尾,char\b


5、分组:

    \(string\):string字符去匹配

    


6、引用:

    \1:后向引用,引用前面第一个左括号以及与之对应的右括号中的模式所匹配到的内容

    \(a.b\)xy\1----->a5bxya5b


扩展正则表达式:egrep,同grep -E


1、字符匹配:同正则表达式

2、次数匹配:

    *:匹配其前面的字符任意次

    ?:匹配其前面的字符0次或一次

    +:匹配其前面的字符至少一次

    {m}:匹配其前面的字符m次

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

    {m,}:至少m次

    {0,n}:至多n次

3、锚定:

    ^:行首

    $:行尾

    \<,\b:词首

    \>,\b:词尾

4、分组:

    ():分组

    |:或者,字符或者


fgrep:不解析正则表达式,直接按字符去匹配


例题:

1、  显示/proc/meminfo文件中以大小写s开头的行

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

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

 

2、  取出默认shellbash的用户

# grep “bash$”/etc/passwd |cut  -d: -f1

# grep -E “bash$”/etc/passwd|cut  -d: -f1

 

3、  取出默认shellbash的且其ID号最大的用户

# grep “bash$”/etc/passwd | sort  -n  -t:  -k3|tail -1|cut  -d: -f1

# grep -E “bash$” /etc/passwd | sort  -n  -t:  -k3|tail  -1|cut  -d: -f1

 

4、  显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行

grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}"/etc/rc.d/rc.sysinit

grep  -E “^#[[:space:]]{1,}[^[:space:]]{1,}”/etc/rc.d/rc.sysinit

 

5、  显示/boot/grub/grub.conf中以至少一个空白字符开头的行

# grep "^[[:space:]]\{1,\}"/boot/grub/grub.conf

# grep -E"^[[:space:]]{1,}" /boot/grub/grub.conf

 

6、  找出/etc/passwd文件中一位数或两位数

# grep --color=auto “\>[[:digit:]]\{1,2\}\>” /etc/passwd

# grep --color=auto -E "\<[[:digit:]]{1,2}\>" /etc/passwd

 

7、  找出ifconfig命令结果中的1-255之间的整数

# ifconfig | grep -E--color=auto"\<[1-9][0-9][0-9]\>\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}"


8、  查看当前系统上root用户的所有信息

# grep “^root\>”  /etc/passwd

# grep"^root\>" /etc/passwd

 

9、  添加用户testbashbashbasher,而后查找出当前系统上用户名和shell相同的用户

# useradd bash

# useradd testbash

# useradd  basher

# grep “^\([[:alnum:]]\{1,\}\)\>.*\1$”/etc/passwd

# grep --color=auto -E "^([[:alnum:]]{1,})\>.*\1$" /etc/passwd


10、             找出netstat -tan命令结果中以LISTENESTABLISHED结尾的行

# netstat -tan| grep"[LISTEN|ESTABLISHED]$"

# netstat -tan| grep -E "(LISTEN|ESTABLISHED)\>"

 

11、             取出当前系统上所有用户的shell,要求:每种shell只显示一次,并按升序显示

cut  -d: -f7 /etc/passwd|sort  -u


本文出自 “grep及正则详解” 博客,请务必保留此出处http://tingfengsiyu.blog.51cto.com/10042389/1862191

grep详解