码迷,mamicode.com
首页 > 其他好文 > 详细

grep正则表达式

时间:2015-09-02 19:14:09      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:expression   search   regular   表达式   grep   


一、前言

   grep是功能强大的文本处理工具,全称:global search regular expression and print out the line,grep一行一行使用正则表达式匹配文本,之后对匹配到的文本整行显示(除非使用特定的选项取反,如 grep -v)。


二、grep用法

grep命令用法:        

   grep [OPTIONS] PATTERN [FILE…]

   grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

   为了使用grep用法,我们不得不先简单学习下正则表达式


2.1、正则表达式用法

  首先,我们要明白什么是正则表达式?所谓正则表达式就是使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。正则表达式由一些普通字符和元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。


2.1.1、基本正则表达式的元字符用法

a:字符匹配

.匹配任意单个字符例如:grep ‘roo.‘ /etc/passwd
[]匹配指定范围内的任意单个字符 例如:grep ‘[ro]‘ /etc/passwd
[^]取反 例如:grep ‘[^ro]‘ /etc/passwd                          

b:次数匹配

*匹配任意次数例如: grep ‘roo*‘ /etc/passwd
\?匹配其前面字符出现0或者1次例如: grep ‘roo\?‘ /etc/passwd
\{m\}匹配其前面字符出现m次 例如: grep ‘ro\{2\}‘ /etc/passwd
\{m,\}匹配其前面字符最少出现m次 例如: grep ‘ro\{2,\}‘ /etc/passwd
\{m,n\}匹配其前面字符最少出现m次,最多n次例如: grep ‘ro\{2,3\}‘ /etc/passwd
\{0,n\}匹配其前面字符最多n次 例如: grep ‘ro\{0,2\}‘ /etc/passwd              

c:位置锚定匹配

^行首锚定符 例如:grep ‘^root‘ /etc/passwd
$行尾锚定符例如:grep ‘shell$‘ /etc/passwd
\<词首锚定符例如:grep ‘\<root‘ /etc/passwd
\>词尾锚定符 例如:grep ‘shell\>‘ /etc/passwd                         

d:分组

\(\)分组,分组中模式匹配的内容可被引用例如:grep ‘\(root\).*\1‘ /etc/passwd        

e:引用

\#引用分组中第#个内容(#为数字)例如:grep ‘\(root\).*\1‘ /etc/passwd       

2.1.2、扩展正则表达式的元字符用法

a:字符匹配

.匹配任意单个字符 例如:egrep ‘roo.‘ /etc/passwd
[]匹配指定范围内的任意单个字符例如:egrep ‘[ro]‘ /etc/passwd
[^]取反 例如:egrep ‘[^ro]‘ /etc/passwd                         

b:次数匹配

*匹配任意次数例如: egrep ‘roo*‘ /etc/passwd
+匹配前面字符出现1次以上例如: egrep ‘root‘ /etc/passwd
?匹配其前面字符出现0或者1次例如: egrep ‘roo?‘ /etc/passwd
{m}匹配其前面字符出现m次例如: egrep ‘ro{2}‘ /etc/passwd
{m,}匹配其前面字符最少出现m次例如: egrep ‘ro{2,}‘ /etc/passwd
{m,n}匹配其前面字符最少出现m次,最多n次 例如: egrep ‘ro{2,3}‘ /etc/passwd
{0,n}匹配其前面字符最多n次 例如: egrep ‘ro{0,2}‘ /etc/passwd          

c:位置锚定匹配

^行首锚定符 例如:egrep ‘^root‘ /etc/passwd
$行尾锚定符 例如:egrep ‘shell$‘ /etc/passwd
\<词首锚定符例如:egrep ‘\<root‘ /etc/passwd
\>词尾锚定符 例如:egrep ‘shell\>‘ /etc/passwd                    

d:分组

( )分组,分组中模式匹配的内容可被引用例如:egrep ‘(root\).*\1‘ /etc/passwd   

e:或者

|或者 例如: egrep ‘bash|nologin‘ /etc/passwd                    

f:引用

\number引用第几个匹配例如 grep ‘(12).*\1‘ /etc/passwd

2.3 grep常用的选项

-v反向选择例如:grep -v ‘root‘ /etc/passwd
-o仅显示匹配的字符串本身,而非所在行 例如:grep -o ‘root‘ /etc/passwd
-i忽略大小写 例如:grep -i ‘root‘ /etc/passwd
-E支持使用扩展正则表达式 例如:grep -E ‘(root).*\1‘ /etc/passwd
-A后面n行 例如:grep -A 3 ‘root‘ /etc/passwd
-B前面n行例如:grep -B 3 ‘mysql‘ /etc/passwd
-C前后各n行例如:grep -C 3 ‘mysql‘ /etc/passwd                      

三、例题

3.1、显示/etc/passwd文件中以bash结尾的行

grep ‘\<bash\>$‘ /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    leon:x:500:4400::/home/leon:/bin/bash
    mandirva:x:2200:4400::/home/mandirva:/bin/bash
    ......
    centos:x:2241:2241::/home/centos:/bin/bash
    user1:x:2242:2242::/home/user1:/bin/bash

3.2、显示/etc/passwd文件中的两位数或三位数

grep ‘\<[[:digit:]]\{2,3\}\>‘ /etc/passwd
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
    saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    leon:x:500:4400::/home/leon:/bin/bash
    openstack:x:501:501:This‘s openstack:/home/openstack:/bin/bash

3.3、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行

netstat -tan | grep ‘LISTEN‘[[:space:]]* 
    tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
    tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
    tcp        0      0 :::22                       :::*                        LISTEN      
    tcp        0      0 ::1:25                      :::*                        LISTEN

3.4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行

grep ‘^\([[:alnum:]]*\):.*\1$‘ /etc/passwd
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    nologin:x:2208:2208::/home/nologin:/sbin/nologin

3.5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)

grep -E ‘^root|^centos|^user1‘ /etc/passwd | cut -d: -f1,3,7
    root:0:/bin/bash
    centos:2241:/bin/bash
    user1:2242:/bin/bash

3.6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行

grep -E ‘\<[[:alpha:]]+_?\(\)‘ /etc/rc.d/init.d/functions 
    checkpid() {
    daemon() {
    killproc() {
    pidfileofproc() {
    pidofproc() {
    status() {
    success() {
    failure() {
    passed() {
    warning() {
    action() {
    strstr() {
    confirm() {

3.7、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名

echo /etc/passwd | egrep -o ‘[[:alnum:]]+$‘ 
    passwd
echo /etc/passwd | egrep -o ‘^(/).*\1‘ 
    /etc/

3.8、找出ifconfig命令执行结果中1-255之间的数字

ifconfig | grep -Eo ‘\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>‘ | sort | uniq
    1
    2
    6
    8
    27
    41
    56
    64
    75
    101
    106
    127
    128
    168
    192
    255


本文出自 “leon91” 博客,请务必保留此出处http://leon91.blog.51cto.com/3639216/1690755

grep正则表达式

标签:expression   search   regular   表达式   grep   

原文地址:http://leon91.blog.51cto.com/3639216/1690755

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!