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

grep+正则表达式

时间:2015-04-01 20:25:20      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:表达式


在Linux运维中会经常使用到三剑客中的grep命令,grep命令对文本文件搜索,搜索是以行为单位进行的,用于搜索指定匹配模式中的行。grep命令在不使用正则表式可以完成简单的一些工作,当你面对几万行或更多的文件时,你是不是已经醉了@_@。。。那就请使用正则表达式吧,它是你强大而有力的助手。

        

  他们都说正则表达式很难,你是不是已经害怕了呢?如果你想在几分钟之内就能完全的精通正则表达式,要么你是一个天才,要么你是从外星球来的。

        

  学习正则表式是要经过长期的不断的练习,我相信你就是下一个天才。。

        

  正则表达式分为基本正则表达式与扩展正则表达式。    

        

  我希望我能以最简单的例子让你明白grep和正则表达式中一些简单的用法:


(1)查找/etc/passwd文件中有“root”字样的行:

[root@Bisc-lab01 ~]# grep -n--color "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
#-n:表示显示查找到的行号
#--color:用颜色来高亮显示所匹配的内容
#”root”:查找行有”root”字样的行,这就是我们要查找的条件
#/etc/passwd:指定查找的文件,可以是绝对路径或相对路径

(2)  查找/etc/passwd文件,只显示数字为两位数的数字

[root@Bisc-lab01 ~]# grep -o"\b[0-9]\{2\}\b" /etc/passwd
12
10
14
……………省略输出……………
#-o:只显示被模式匹配到内容
#\b:用于锚定模式的词首,不是行首哦!!!使用“\<”等于“\b”。
#[0-9]:表示所有的数字,也可以用[:digit:]表示0-9。[]在表示区间范围,在正则表达式中表示
#      匹配区间范围内单个任意字符。如果我想取除了数字之外的任意字符呢?使用“[^]”。
#\{2\}:表示精确的匹配其前一个字符出现2次。
#\b:锚定词尾,等价于“\>”

(3)查找/etc/passwd文件中,以r开头其后跟着任意的字符,但以sh结尾的行。

[root@Bisc-lab01 ~]# grep"^r.*sh$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
#^:表示行首,“^r”表示以r为行首的行
#.*:表示任意字符任意次,“.”(点):表示任意单个字符;“*”:表示其前个字符出现任意次,
#    可以是0次,1次或更多;“.*”:组合起来就来就表示任意字符出现任意次。
#$:表示行尾,“sh$”:表示以sh结尾的行。

(4)查找/etc/passwd文件中,以其字母开为行首,必以其字母结尾的行。

思路
分析此题:表示以什么字母为行首,就以什么字母结束,如a………a,中间是任意的字符,
[root@Bisc-lab01 ~]# grep"^\([a-zA-Z]\).*\1$" /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nfsnobody:x:65534:65534:AnonymousNFS User:/var/lib/nfs:/sbin/nologin
hadoop:x:600:600::/home/hadoop:/bin/bash
#[a-zA-Z]:表示所有字母,其a-zA-Z等价于[:alpha:],如果[[:alpha:]]*是什么意思呢?将会出现
#          匹配到所有的/etc/passwd的行。
#\(\):表示分组,意思就是用于记忆grep匹配过程中[a-zA-Z]的值。
\1:引用,从左至右的每一个括号中的匹配过程中的值。

(5)查找ifconfig命令结果输出的所有1-255的数字

思路:
         分析此题:1-255数字的构成,我们可以这样的来分析:
         1-9:[1-9]
         10-99:[1-9][0-9]
         100-199:1[0-9][0-9]
         200-249:2[0-4][0-9]
         250-255:25[0-5]
         在查找中可能会有1位的数,2位的数或3位的数,所以我们要使用扩展正则表达式中的或“|”
[root@Bisc-lab01 ~]# ifconfig|grep -E "\b([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b"
eth0      Link encap:Ethernet  HWaddr 00:0C:29:32:A8:C8 
          inet addr:172.16.9.20  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr:fe80::20c:29ff:fe32:a8c8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1
          RX bytes:7258553 (6.9 MiB)  TX bytes:764629 (746.7 KiB)
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536 Metric:1
          RX packets:24 errors:0 dropped:0overruns:0 frame:0
          TX packets:24 errors:0 dropped:0overruns:0 carrier:0
          RX bytes:1940 (1.8 KiB)  TX bytes:1940 (1.8 KiB)
#\b:表示锚定词首
#():表示分组,在此题中用于表示标识一个词,也就是1-255其中的一个数,扩展正则表达式的()括号不用\转义。
#[1-9]:表示1到9中任意一个数字
# | :表示或


本文出自 “乌大宛” 博客,请务必保留此出处http://wuday.blog.51cto.com/2623944/1627263

grep+正则表达式

标签:表达式

原文地址:http://wuday.blog.51cto.com/2623944/1627263

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