首页 > 代码库 > 菜鸟的成长记录--linux正则表达式及grep

菜鸟的成长记录--linux正则表达式及grep

正则表达式

    是一类字符所书写的模式,其中许多字符不表示其字面意义,而是表达控制或通配等功能;正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

    元字符:不表示其字面意义,而用于额外功能性描述,下面是常用的元字符列表

符号

含义

.

表示匹配任意单个字符,例a.,匹配ab、ac、ad、ax

*

表示它前面的字符可以出现任意次,例a*b,匹配aab、b、ab

\?

表示它前面的字符可有可无,例a\?b,匹配ab、b、xb

\{m\}

表示它前面的字符出现m次,例a\{2\}b,匹配aab、aaaab、aaaaaabbbb

\{m,n\}

表示它前面的字符至少出现m次,最多出现n次,例a\{2,5\}b,匹配aab、aaab、

\{m,\}

表示它前面的字符至少出现m次,例a\{2,\}b,匹配aab、aaaaaaaaaaaabbbbb

\{0,n\}

表示它前面的字符最多出现n次,例a\{0,3\}b,匹配b、aab、aaaaabbbbb

.*

表示任意长度的任意字符,贪婪模式,尽可能多的去匹配

^

表示行首锚定,例^a,表示以a开头的行

$

表示行尾锚定,例$a,表示以a结尾的行

^$

表示空白行

\<

表示词首锚定,出现于单词左侧 单词:不包含特殊字符的连续字符组成的串叫单词

\>

表示词尾锚定,出现于单词右侧

\#

引用第n个括号所匹配到的内容,而非模式本身,例\(ab\).*\1,匹配absdfdfab

+

表示它前面的字符至少出现一次

 

Linux grep及egrep

    grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

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

    基本正则表达式:grep

    常用参数:

        -v: 反向选取

        -o: 仅显示匹配的字串,而非字串所在的行

        -i: ignore-case,忽略字符大小写

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

    egrep和grep最大的区别:egrep是grep 的扩充版, 改良了许多传统 grep 不能或不便的操作. 比方说:
    - grep 之下不支持 ? 与 + 这两种 modifier, 但 egrep 则可.
    - grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可.
    - grep 在处理 {n,m} 时, 需用 \{ 与 \} 处理, 但 egrep 则不需.

 

例题

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

    # grep -i ‘^s‘ /proc/meminfo

    # grep ‘^[Ss]‘ /proc/meminfo 

    # grep -E ‘^(S|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 | sort -t: -k3 -n | tail -1 | cut -d: -f1              

     

    4、找出/etc/passwd文件中的一位数或两位数;

    # grep "\<[0-9][0-9]\?\>" /etc/passwd

    # grep "\<[0-9]\{1,2\}\>" /etc/passwd

 

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

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

     

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

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

     

    7、找出netstat -tan命令执行结果中以‘LISTEN‘结尾的行;

    # netstat -tan | grep "LISTEN[[:space:]]*$"

     

    8、添加用户bash, testbash, basher, nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认shell相同的用户;

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

     

    10、显示当前系统上root、fedora或user1用户的默认shell;

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

     

    11、找出/etc/rc.d/init.d/functions文件中某单词后跟一组小括号“()”行;

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

     

    12、使用echo命令输出一个路径,而后使用grep取出其基名;

    echo "/etc/sysconfig/" | grep -o -E "[[:alnum:]]+/?"

    # echo "/etc/sysconfig/" | grep -o -E "[^/]+/?$" | cut -d/ -f1

 

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

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


本文出自 “鱼儿” 博客,请务必保留此出处http://kyfish.blog.51cto.com/1570421/1437655