码迷,mamicode.com
首页 > 系统相关 > 详细

Linux文本处理三剑客之grep

时间:2016-06-12 15:35:57      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:linux文本处理三剑客之grep、egrep、fgrep、正则表达式

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配到的行打印出来。


grep的全称是:Global Search Regular Expression and print out the line.grep的工作方式是在一个或多个文件中搜索字符串模式,如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名,搜索的结果被送到标准输出,不影响文件的内容。grep也可用于shell脚本,经常使用grep通过返回状态值来说明搜索的状态,如果模式搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2.利用这些返回值就可以进行一些自动化的文本处理工具。

grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。  egrep是grep的扩展,支持更多的RE元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符  表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。  

正则表达式定义:是一些字符或是特殊字符串模式的集合。    
功能:根据模式搜索文本,并将符合模式的文本行显示出来。  
Pattern(模式): 文本字符和正则表达式的元字符组合而成匹配条件  

#正则表达式就是里面有一些元字符,这些字符不表示它本身的意思,而表示通配的意义。

注:默认情况下正则表达式工作在贪婪模式下

基本正则表达式元字符:
字符匹配:
    . :匹配任意单个字符;
    [] :匹配指定范围内的任意单个字符;
    [^]:匹配指定范围外的任意单个字符;
        [:digit:][:alpha:][:upper:][:lower:][:space:][:alnum:][:punct:]

匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;
    *: 匹配其前面的字符任意次;0.1,多次;
    .*:匹配任意长度的任意字符
    \?: 匹配其前面的字符0次或1次;即前面的字符是可有可无的;
    \+: 匹配其前面的字符一次或多次;即前面的字符要出现至少一次;
    \{m\}:匹配前面的字符m次;
    \{m,n\}:匹配其前面的字符至少m次;至多n次;

位置锚定:
    ^ :行首锚定;用于模式的最左侧;
    $ :行尾锚定:用于模式的最右侧;
        ^PATTERN$:用PATTERN来匹配整行;
        ^$:空白行;
        ^[[:space:]]*$:空行或包含空白字符的行        
    \<或\b:词首锚定,用于单词的最左侧;
    \>或\b:词尾锚定,用于单词的最右侧;
    \<PATTERN\>:精确匹配完整单词;

分组及引用
    \(\):将一个或多个字符捆绑在一起,当做一个整体进行处理
    \(xy\)*ab
         
Note:
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\3:...
...
*后向引用:引用前面的分组括号中的模式所匹配到的字符

扩展正则表达式的元字符
     
字符匹配:
    .:
    []:
    [^]:

次数匹配:
    *:任意次
    ?:0次或1次,
    +:其前字符至少一次;
    {m}:期前的字符m次;
    {m,n}:至少m次,至多n次;

位置锚定:
    ^:行首锚定
    $:行尾锚定
    \<,\b:词首锚定
    \>,\b:词尾锚定
分组及引用:
    ():分组;括号内的模式匹配到的字符会被记录与正则表达式引擎的内部变量中;
    后向引用:\1,\2...
或:
    a|b:
        C|cat:C或cat
        (c|C)at:cat或Cat


grep:
    #文本搜索过滤工具,支持基本正则表达式
    SYNOPSIS: grep [OPTIONS] PATTERN [FILE...]
    Options:
        --color=auto:对匹配到的文本着色后高亮显示;
        -i:igmorecase,忽略字符的大小写;
        -o:仅显示匹配到的字符串本身;
        -v:--invert-match:反向显示;
        -n:输出行号
        -c:统计被匹配到的字符串出现的次数
        -w:以字符为单位精确匹配
        -E:--entended-regexp:支持扩展的正则表达式元字符;
        -q:--quiet,--silent;静默模式,不输出任何信息;
        -A #:after,后#行
        -B #:before,前#行
        -C #:context,前后各#行


E.g:

1、查看sda硬盘状态,并显示行号
~]# df -lh |grep -n "\<sda.*"2:/dev/sda3        30G  3.2G   27G  11% /
7:/dev/sda1       497M  154M  344M  31% /boot

2、仅显示test文件中字3个字符组成的单词
~]# grep -o -w "[[:alpha:]]\{3\}" test  
var
ntp
etc
ntp
bin
bin



egrep:
    支持扩展的正则表达式实现类似于grep文本过滤         
    SYNOPSIS: grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
    OPTINOS:
         同grep
           -G:持基本正则表达式
E.g:

1、查找文件里所有1位数和二位数,并仅显示被匹配到的字符串本身
~]# grep -Eo "(\<[0-9][0-9]\>|\<[0-9]\>)" test
89
89
38
38
72
72
0

2、显示/etc/grub2.cfg文件中以至少一个空白字符开头后面跟非空白字符的行,并区结果的最后五行输出到屏幕
~]# grep -n "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg|tail -5
112:    fi
113:   
 linux16 /vmlinuz-0-rescue-f6d8429dc7d34e548fde61cc3c526f0c 
root=UUID=49ceaa41-d060-4dd1-b3d0-c9d7928958fc ro crashkernel=auto rhgb 
quiet
114:    initrd16 /initramfs-0-rescue-f6d8429dc7d34e548fde61cc3c526f0c.img
136:  source ${config_directory}/custom.cfg
138:  source $prefix/custom.cfg;

        
#egrep可以把很多grep里面的正则表达式转意符去除,使命令更简洁,具体参考扩展正则表达式

fgrep:不支持正则表达式元字符;
    当不需要用到元字符去编写模式时,使用fgrep必能更好。



本文出自 “Linux运维” 博客,请务必保留此出处http://allenyang.blog.51cto.com/10991027/1788196

Linux文本处理三剑客之grep

标签:linux文本处理三剑客之grep、egrep、fgrep、正则表达式

原文地址:http://allenyang.blog.51cto.com/10991027/1788196

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