grep命令及正则表达式

grep命令
   
   grep , egrep , fgrep

   grep,sed,awk 文本处理三剑客

   grep: Global search REgular expression and Print out the line;全面查找正则表达式并将匹配到的行显示出来;

正则表达式
  
   正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用;许多程序设计语言都支持利用正则表达式进行字符串操作;

   主流的正则引擎又分为三类:DFA;传统型NFA;POSIX NFA;
   
       DFA: awk,egrep,flex,MySQL,Procmail等;

       传统型NFA: GUN Emacs,java,ergp,less,.NET语言,PCRE library,Perl,PHP,Python,Ruby,sed,vi,vim;

       POSIX NFA: mawk,Mortice Kern System' utilities,GUN Emacs(使用时可以明确指定);

       DFA/NFA混合: GUN awk,GUN grep/egrep,Tcl;

grep用法:
    
    grep:外部命令

       功能:从源数据中显示出被模式匹配到的行;

           注:grep默认工作模式为贪婪模式,也就是说,每次grep进行模式匹配都是按照尽可能多的去完成匹配的标准进行的;

 grep [OPTIONS] PATTERN [FILE...]

 grep [OPTIONS] [-e PATTERN] [-f FILE] [FILE]

 常用选项:
 -A NUM,--after-context=NUM: 被模式匹配到的行以及其后#行;其后若没有,则不显示;不能同-o选项一同使用;
 -B NUM,-before-context=NUM: 被模式匹配到的行以及其前#行;其后若没有,则不显示;不能同-o选项一同使用;
 -C NUM,--context=NUM: 被模式匹配到的行以及其前后各#行;其前后若没有,则不显示;不能同-o选项一同使用;
 --color=auto: 对匹配到的文本着色显示;
 -e PATTERN,--regrep=PATTREN: 实现以逻辑或的关系完成多个模式的匹配,每个-e选项只能带一个模式作为参数;
 -E,--extended-regexp: 扩展正则表达式开关,能够让grep使用扩展正则表达式,同egrep;
 -i,--ignore-case: 忽略字符大小写;
 -n,--line-number: 显示匹配到的行并在其前加行号(文件中的行号)
 -o,--only-matching: 仅显示匹配到的字符串;
 -q,--quiet--silent: 静默模式,不输出任何信息;
 -v,--invert-match: 显示没有被匹配到的行;
 -w,-Word-regexp: 整行匹配整个单词;

 退出状态:
 若成功查找到被选中的行,状态返回值为0;否则则为1;

        基本正则表达式元字符:

 1.字符匹配:

 . : 匹配任意单个字符;
 []: 匹配指定范围内的任意单个字符;
 [^]: 匹配指定范围外的任意单个字符;
 [:digit:]: 表示所有十进制数字,相当于[0-9];
 [:lower:]: 表示所有小写的字母,相当于[a-z];
 [:upper:]: 表示所有大写的字母,相当于[A-Z];
 [:alpha:]: 表示所有字母,包括大写和小写;
 [:alnum:]: 表示包括所有大小写字母及十进制数字;
 [:space:]: 表示所有空白字符;
 [:punct:]: 表示所有特殊字符;

 2.匹配次数(用在要指定其出现的次数的字符后面):

 *: 匹配其前面字符任意次;
 .*: 匹配任意长度的任意字符;
 \?: 匹配其前面字符0或1次;
 \+: 匹配其前面字符1或多次;
 \{m\}: 匹配其前面字符m次;
 \{m,n\}: 匹配其前面字符至少m次,至多n次;
 \{0,n\}: 至多n次 ; \{m,0\}: 至少m次;

 3.位置锚定:

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

            4.分组及引用:

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

egrep:
 支持扩展的正则表达式实现类似于grep文本过滤功能: grep -E

 egrep [OPTIONS] PATTREN [FILE...]
 选项:
 -i,-o,-v,-q,-A,-B,-C
 -G:支持基本正则表达式;相当于grep;

 扩展正则表达式的元字符:
 除了在匹配次数中不必使用转义符"\"之外,其它与基本正则表达式的元字符一样;

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


应用实例:
    
    1.取出/etc/sysconfig/network-scripts/ifcfg-eno16777736这个文件的基名
        ~]# echo /etc/sysconfig/network-scripts/ifcfg-eno16777736 | grep -o "[^\/]\+\/\?$" 

    2.找出/etc/rc.d/init.d/functions文件中某单词(包括下划线)后面跟一个小括号的行
        ~]# grep -o ".*_*.*()" /etc/init.d/functions

    3.显示/etc/passwd文件中用户名与该用户的默认shell名相同的用户账户信息
        ~]# grep -E "(\<.+\>).*\1$" /etc/passwd

    4.显示利用ldd命令查看到的ls命令所使用的动态库文件的绝对路径
        ~]# ldd /bin/ls | egrep -o "/.*lib(64)?/[^[:space:]]+"

    5.grep还可以从多个文件中查找匹配字符,如:
        ~]# grep 'ro' ./*

https://blog.51cto.com/ryanpeng/1831858