grep+正则表达式


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

        

  他们都说正则表达式很难,你是否是已经惧怕了呢?若是你想在几分钟以内就能彻底的精通正则表达式,要么你是一个天才,要么你是从外星球来的。正则表达式

        

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

        

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

        

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


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

[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结尾的行。spa

[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文件中,以其字母开为行首,必以其字母结尾的行。hadoop

思路
分析此题:表示以什么字母为行首,就以什么字母结束,如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的数字it

思路:
         分析此题: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中任意一个数字
# | :表示或
相关文章
相关标签/搜索