设为首页 收藏本站
查看: 660|回复: 0

shell编程之grep和正则表达式

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-7-11 09:12:49 | 显示全部楼层 |阅读模式
文本处理工具:

linux上文本处理三剑客:
    grep:文本过滤工具(模式:pattern);
        grep:基本正则表达式,-E,-F
        egrep:扩展正则表达式,-G,-F
        fgrep:不支持正则表达式,-E,-G
    sed:steam editor,流编辑器;文本编辑工具;
    awk:linux上的实现为gawk,文本报告生成器(格式化文本);
   
    正则表达式:Regular Expression,REGEXP
        由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;
            分两类:
                基本正则表达式:BRE
                扩展正则表达式:ERE
               
        正则表达式引擎:
        采用不同算法,检查处理正则表达式的软件模块
        PCRE(Perl Compatible Regular Expressions)
            
        元字符:\(hello[[:space:]]\+\)\+        
        元字符分类:字符匹配、匹配次数、位置锚定、分组
        
grep:Global search REgular expression and Print out the line.

    作用:文本搜索工具,根据用户指定的"模式(过滤条件)"对目标文本逐行进行匹配检查;打印匹配到的行;
    模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
   
    用法:grep "UUID" /etc/fstab
    grep [OPTIONS] PATTERN [FILE...]
    grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
   
        grep root /etc/passwd
        grep "$USER" /etc/passwd
        grep `whoami` /etc/passwd

    选项:
        --color=auto:显示颜色;
        -i, --ignore-case:忽略字符大小写;
        -o, --only-matching:只显示匹配到的部分;
        -n, --line-number:显示行号;
        -v, --invert-match:反向显示,显示未匹配到的行;
        -E, --extended-regexp:支持使用扩展的正则表达式;
        -q, --quiet, --silent:静默模式,即不输出任何信息;
        -w, --word-regexp:整行匹配整个单词;
        -c, --count:统计匹配到的行数; print a count of matching lines;
        
        -A#:after,后#行
        -B#:before,前#行
        -C#:context,前后各#行
   
   
基本正则表达式元字符:

    字符匹配:
        .:匹配任意单个字符;
        []:匹配指定范围内的任意单个字符;
        [^]:匹配指定范围外的任意单个字符;
        
    匹配次数:用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数;
        *:匹配其前面的字符任意次;0,1,多次;
            例如:grep "x*y"
                abxy
                aby
                xxxxy
                yab
        .*:匹配任意长度的任意字符;
        \?:匹配其前面的字符0次或1次;
        \+:匹配其前面的字符1次或多次;即其前面的字符要出现至少1次;
        \{m\}:匹配其前面字符m次;
        \{m,n\}:匹配其前面的字符至少m次,至多n次;
            \{0,n\}:至多n次
            \{m,\}:至少m次
        
    位置锚定:
        ^:行首锚定;用于模式的最左侧;匹配开头的字符;
            grep '^root' /etc/passwd 匹配以root开头的字符
            
        $:行尾锚定;用于模式的最右侧;匹配结尾的字符;
            grep 'r.*h$' /etc/passwd 匹配以r开头以h结尾的字符
            
            ^$:空白行
            ^[[:space:]]*$:空行或包含空白字符的行;
        
        单词:非特殊字符组成的连续字符(字符串)都称为单词;
        
        \<或\b:词首锚定,用于单词模式的左侧;界定单词的左边界;
            \<hello 用于匹配以hello开头的单词
        \>或\b:词尾锚定,用于单词模式的右侧;
            hello\> 用于匹配以hello结尾的单词
        \<PATTERN\>:匹配完整单词;
            \<hello\> 可精确匹配单词hello,而不是helloworld
   
   
    分组及引用
        \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;括号不能交叉,但可以嵌套;
            \(xy\)*ab
            
        注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部变量中,这些变量为:
            \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
            \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
            \3:
            ...
               
            vim lovers.txt
            
            he loves his lover.
            he likes his lover.
            she likes her liker.
            she loves her liker.
            
            grep "\(l..e\).*\1" lovers.txt   
            
            grep "^\(r..t\).*\1" /etc/passwd
               
        后向引用:\1表示后向引用,引用前面第一个括号所匹配到的内容;
        
    \d:匹配一个数字;等价于[0-9];
    \w:匹配字母、数字和下划线;
    \w:匹配非字母、数字和下划线;
    \n:换行符;
    \r:回车;
    \t:制表符;tab
    \f:换页符;
    \s:空白字符;
    \S:非空白字符;

egrep:

    支持扩展的正则表达式实现类似于grep文本过滤功能; grep -E
   
    egrep [OPTIONS] PATTERN [FILE...]
        选项:与grep相同
        特别选项:
            -G:支持基本正则表达式
            
        扩展正则表达式的元字符:
            字符匹配:
                .:任意单个字符
                []:指定范围内的任意单个字符
                [^]: 指定范围外的任意单个字符
            次数匹配:
                *:任意次,0,1或多次;
                ?:0次或1次,其前的字符是可有可无的;
                +:其前的字符至少1次;
                {m}:其前的字符m次;
                {m,n}:至少m次,至多n次;
                    {0,n}
                    {m,}
            位置锚定
                ^:行首锚定;
                $:行尾锚定;
                \<,\b:词首锚定;
                \>,\b:词尾锚定;
                    grep "\<abc" f1 过滤abc开始的单词的行
                    grep " abc\>" f1 过滤abc结尾的单词的行
                    grep ‘c.\{2\}t’ f1 c后面任意两个字符加t
                    
            分组及引用
                ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;
                后向引用:\1,\2,...
            或:
                a|b:a或者b;
                    C|cat:C或cat;
                    (c|C)at:cat或Cat   
        
fgrep:不支持正则表达式元字符;
    当无需用到元字符去编写模式时,使用fgrep性能更好;
   
   
   


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-242349-1-1.html 上篇帖子: shell编程之awk 下篇帖子: shell编程之sed 表达式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表