grep及正则表达式

来源:互联网 发布:淘宝出售虚拟物品 编辑:程序博客网 时间:2024/06/06 18:26

grep及正则表达式

什么是grep

grep 全名是 Global search Regular expression and Print out the line – 全局搜索正则表达式并打印到当前行,那不难看出来grep就是一个作用在正则表达式上的搜索工具了,那么怎么实用grep呢,下面我们来做下简介

grep – 分枝
  • grep 分为三类分枝
基本正则表达式 扩展正则表达式 不支持正则表达式 grep egrep fgrep BRE ERE 常用的 常用的 快速查找也是常用的grep – 的基本语法
  • grep [OPTIONS] PATTERN [FILE…]; 模式(pattern): 由正则表达式字符及文本字符所编写的过滤条件
    –color=auto 长选项,给匹配到的模式着色。(CentOS 7 的
    别名自带)
    -v : 显赤不被模式匹配到的行
    -o : 仅显示匹配到的字符串本身
    -q : 静默模式,不输出任何信息
    -A # : 显示所匹配到的后#行
    -B # : 显示所匹配到的前#行
    -C # : 显示所匹配到的前后各#行

                                                                等等...                                                           *常用帮助请参考man文档

什么是正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

    1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
    1. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

即说到了匹配,那我们接下来说下正则的元定符

基本正则的元字符

-

字符匹配:       .: 匹配任意的单个字符      []: 匹配指定范围内的任意单个字符     [^]: 匹配指定范围外的任意单个字符匹配次数:       *: 匹配前面的字符任意次(包括0次)      \?: 匹配前面的字符0次或1次      \+: 匹配前面的字符至少1次   \{m\}: 匹配前面的字符m次  \{m,n\}: 匹配前面的字符至少m至n次 \{,m\}: 匹配前面的字符至多m次位置锚定:      \<: 锚定词首,也可以用\b表示      \>: 锚定词尾,也可以用\b表示      ^ : 行首锚定      ^ : 行尾锚定     ^$ : 空行   分组:    \(\): 将一个或多个字符捆绑一起当一个整体引用

以上信息我们做几个示例来看看

字符匹配
      例:  参照f2文件        [root@localhost ~]# cat f2               <-当前f2文件用cat查看有以下这些内容        a        ab        ba        aa        abc        cba        cbabc. 匹配任意单个字符               [root@localhost ~]# grep "a." f2         <-grep查找a后面跟着个任意单个字符的行        ab        aa        abc        cbabc                                                 **查找到的四行内容均符合所查询的条件[]-匹配指定范围内的任意单个字符        [root@localhost ~]# grep "a[a-z]" f2 <- grep查找当前a后面a-z的任意单个字母        ab        aa        abc        cbabc                                                 **[a-z]是指定范围a-z内任意的单个字母,在正则中字母的指定不以ASCII码来匹配[^]: 匹配指定范围外的任意单个字符        [root@localhost ~]# grep "[^ab]" f2      <- grep查找非a或b的任意字符        abc        cba        cbabc                                                 **匹配到的行内包括a,b的行都排除了,只有这三行中存在所查询的条件

次数匹配
     例:  参照f2文件 (内有改动)       [root@localhost ~]# cat f2                                                 <- 有个空格       a       ab       abc       aab       abb       aabbcc       aaaaabbbcc*: 匹配前面的字符任意次(包括0次)       [root@localhost ~]# grep "a*" f2          <- grep查找当前a出现任意次的行                                                       <- 空格也匹配到了       a       ab       abc       aab       abb       aabbcc       aaaaabbbcc                                                 **匹配到的行内有空格出现那么就表示即使匹配到的a是0次也算\?: 匹配前面的字符0次或1次       [root@localhost ~]# grep 'ab\?' f2        <- grep查找当前ab匹配到的行 b出现0次或1次       a                                            ab       abc       aab       abb       aabbcc       aaaaabbbcc                                                 **出现的行中有a那证明b可有可无,即0次或1次\+: 匹配前面的字符至少1次       [root@localhost ~]# grep "b\+" f2         <- grep查找b出现在f2中至少一次的行       ab       abc       aab       abb       aabbcc       aaaaabbbcc                                                 **出现最少一次那a没匹配出来就是最好的对比\{m\}: 匹配前面的字符m次       [root@localhost ~]# grep "a\{1\}b" f2     <-grep查找当前行,a出现1次后面接b的行       ab       abc       aab       abb       aabbcc       aaaaabbbcc                                                 **明确指定数值\{m,n\}: 匹配前面的字符至少m至n次       [root@localhost ~]# grep "a\{2,3\}b" f2   <-grep查找当前行,a出现2-3次后面接b的行       aab       aabbcc       aaaaabbbcc                                                 **指定的是一个范围,范围内所匹配到的都是带有2或3个a的。\{,m\}: 匹配前面的字符至多m次                      **这种格式不用做例子也能看出来,指定M是多少就是说从0-m次

位置锚定

\<: 锚定词首,也可以用\b表示   以上图为搜索文档     [root@localhost ~]# grep "\<root" /etc/passwd          root:$6$OVorHBGEwUXX/g0y$bibxqzr48k8TJfCu3iH5q647eJK/V0PbF6SdR84YRRvDqGAw.rvE25ln8srHkuOoxK8fyrSyi/LinbL5MYoDY/:0:0:root:/root:/bin/bash     operator:*:11:0:operator:/root:/sbin/nologin     [root@localhost ~]# grep "\broot" /etc/passwd         root:$6$OVorHBGEwUXX/g0y$bibxqzr48k8TJfCu3iH5q647eJK/V0PbF6SdR84YRRvDqGAw.rvE25ln8srHkuOoxK8fyrSyi/LinbL5MYoDY/:0:0:root:/root:/bin/bash     operator:*:11:0:operator:/root:/sbin/nologin     上面命令是搜索以root为词首的行,其中包含root为词首的行有两行\>: 锚定词尾,也可以用\b表示     [root@localhost ~]# grep "\<zhan\>" /etc/passwd         zhan:$6$eMFgn5mA4ns/rV0D$jW/KYz1v7bE8j19ud9w4qyKEbLBVyKrJ8whJwyMPGbr1RpA.g0q00nMCDtcV4yVKq8Qk/vyC22S/0LOxlfTgB1:1002:1002:zhang:/home/zhan:/bin/bash     [root@localhost ~]# grep "\<zhan" /etc/passwd       zhang:$6$zZqpuWCkSO.eY1Rq$M1Y9T3L3ruvhgBpK91stttRuGuBbZnlkl84gUp4lkWt80MYxAy5y7zhuaavq14sWHaqEm9e7M.OIaJpEZjq/n1:1000:1000:zhang:/home/zhang:/bin/bash     zhan:$6$eMFgn5mA4ns/rV0D$jW/KYz1v7bE8j19ud9w4qyKEbLBVyKrJ8whJwyMPGbr1RpA.g0q00nMCDtcV4yVKq8Qk/vyC22S/0LOxlfTgB1:1002:1002:zhang:/home/zhan:/bin/bash     命令中如果不带锚定行尾也许我们搜出来的就有可能不是很精确,所以在有明确的搜索条件一定要明确搜索,词尾的\b我就不演示了,意义与\>一样^ : 行首锚定     [root@localhost ~]# grep "^zh.*" /etc/passwd     zhang:$6$zZqpuWCkSO.eY1Rq$M1Y9T3L3ruvhgBpK91stttRuGuBbZnlkl84gUp4lkWt80MYxAy5y7zhuaavq14sWHaqEm9e7M.OIaJpEZjq/n1:1000:1000:zhang:/home/zhang:/bin/bash     zhan:$6$eMFgn5mA4ns/rV0D$jW/KYz1v7bE8j19ud9w4qyKEbLBVyKrJ8whJwyMPGbr1RpA.g0q00nMCDtcV4yVKq8Qk/vyC22S/0LOxlfTgB1:1002:1002:zhang:/home/zhan:/bin/bash     命令中是搜索以^zh开头后面任意个字符的行^ : 行尾锚定    [root@localhost ~]# grep "/bin/bash$" /etc/passwd                        root:$6$OVorHBGEwUXX/g0y$bibxqzr48k8TJfCu3iH5q647eJK/V0PbF6SdR84YRRvDqGAw.rvE25ln8srHkuOoxK8fyrSyi/LinbL5MYoDY/:0:0:root:/root:/bin/bas    zhang:$6$zZqpuWCkSO.eY1Rq$M1Y9T3L3ruvhgBpK91stttRuGuBbZnlkl84gUp4lkWt80MYxAy5y7zhuaavq14sWHaqEm9e7M.OIaJpEZjq/n1:1000:1000:zhang:/home/zhang:/bin/bash    zhan:$6$eMFgn5mA4ns/rV0D$jW/KYz1v7bE8j19ud9w4qyKEbLBVyKrJ8whJwyMPGbr1RpA.g0q00nMCDtcV4yVKq8Qk/vyC22S/0LOxlfTgB1:1002:1002:zhang:/home/zhan:/bin/bash    gettoo:!!:1003:1003::/home/gettoo:/bin/bash     命令中我们是搜索以/bin/bash为结尾的行,搜索4条刚好都是以/bin/bash结尾的^$ : 空行    [root@localhost ~]# grep "^$" .bashrc     [root@localhost ~]# cat .bashrc     # .bashrc    # User specific aliases and functions    alias rm='rm -i'    alias cp='cp -i'    alias mv='mv -i'    PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ "    # Source global definitions    if [ -f /etc/bashrc ]; then    . /etc/bashrc    fi    命令刚好搜索出.bashrc内有两行空行

分组
\(\)  分组配合着其它锚定一起使用有一定的便捷性,如我们去取 ifconfig 的ip地址     [root@localhost ~]# ifconfig    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500    inet 192.168.3.3  netmask 255.255.255.0  broadcast 192.168.3.255    inet6 fe80::4f5c:981f:ccf5:8821  prefixlen 64  scopeid 0x20<link>    ether 00:0c:29:12:ae:2f  txqueuelen 1000  (Ethernet)    RX packets 3779  bytes 430543 (420.4 KiB)    RX errors 0  dropped 0  overruns 0  frame 0    TX packets 2473  bytes 1029483 (1005.3 KiB)    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0    [root@localhost ~]# ifconfig |grep -o "inet [[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}"    inet 192.168.3.3    inet 172.18.252.88    inet 127.0.0.1    inet 192.168.122.1    以上的采取Ip的地址虽然不是很精确代码也不是很简洁,但也实现在取ip的结果
原创粉丝点击