专栏名称: 程序猿
本微信公众号:imkuqin,为程序员提供最新最全的编程学习资料的查询。目前已经开通PHP、C/C++函数库、.NET Framework类库、J2SE API查询功能。
目录
相关文章推荐
OSC开源社区  ·  微软Visual ... ·  2 天前  
OSC开源社区  ·  号称汽车上的Android、“装车量”超过2 ... ·  3 天前  
程序员的那些事  ·  一个国外小老头,用被淘汰的编程工具,开发了一 ... ·  5 天前  
程序员小灰  ·  72k,确实可以封神了! ·  1 周前  
51好读  ›  专栏  ›  程序猿

Linux文本处理三剑客之grep

程序猿  · 公众号  · 程序员  · 2016-10-15 15:46

正文

来自:徐长伟 - 博客园

链接:http://www.cnblogs.com/jasperhsu/p/5079393.html(点击尾部阅读原文前往)


Linux上文本处理三剑客:

  • grep:文本过滤工具(模式:pattern)工具;

  • grep:基本正则表达式-E,-F

  • egrep:扩展正则表达式,-G,-F

  • fgrep:不支持正则表达式,

  • sedstream editor,流编辑器;文本编辑工具;

  • awkLinux上的实现gawk,文本报告生成器(格式化文本)


正则表达式:Regual Expression, REGEXP
 

由一类特殊字符及文本字符所编写的模式,其中有些字符不表示期字母意义,而是用于表示控制或通配的功能;


  • 基本正则表达式:BRE

  • 扩展正则表达式:ERE


区别在于两者元字符不同


元字符:一个字符出现以后,它并不表示文件本身,而是用来匹配一定范围内的或者指定符合条件的字符;


grep命令:


grep:Global search REgular expression and Print


作用:文本搜索工具,根据用户指定的"模式(过滤条件)"对目标文本逐行进行匹配检查;打印匹配的行;


模式:有正则表达式的元字符及文本字符所编写的过滤条件;


正则表达式引擎:


grep [OPTIONS] [PATTERN] [FILE...]  

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


常用选项:

--color=auto:对匹配到的文本着色后高亮显示
-i:ignorecase,忽略字符大小写;
-o:仅显示匹配到字符串本身;
-v,--invert-match:反向匹配
-E:支持使用扩展的正则表达式元字符;
-q,--quiet,--silent:静默模式;用于脚本内命令执行状态;
-n或--line-number   在显示行号;
-A # 匹配的到后面几行也显示出来
-B # 匹配的到前面几行也显示出来
-C # 上下文,匹配的到前后面几行也显示出来
基本正则表达式元字符:
字符匹配:  .:匹配任意单个字符    ~]# grep "r..t" /etc/passwd  []:匹配指定范围内的任意单个字符  [^]:匹配指定范围外的任意单个字符    [[:alpha:]][[:digit:]]、[[:lower:]] [[:upepr:]] [[:alnum:]] [[:punct:]] [[:space:]] 匹配次数:用在要指定其出现的次数的字符的后面,用户限制其前面字符出现的次数;  *:匹配器前面的字符任意次:0,1,多次;    例如:grep "x*y"      abxy  aby  xxxy  yab  .*:匹配任意长度的任意字符,贪婪模式,能匹配多长就匹配多长;  \?:匹配其前面的字符0次或者1次;即其前面的字符可有可无的;  \+:匹配其前面的字符一次或多次;即其前面的字符出现至少1次;  \{m\}:匹配其前面的字符m次;  \{m,n\}:匹配其前面的字符至少m次,至多n次;    \{0,n\}:至多n次;    \{m,\}:至少m次; 位置锚定:  ^:行首锚定;用于模式的最左侧;  $:行尾锚定;用于模式的最右侧  ^PATTERN$:用PATTERN来匹配整行;    ^$:空白行;    ^[[:space:]]*$:空行或包含空白字符的行;  单词:非特殊字符组成的连续字符(字符串)都为单词;  \"\  \> 或 \b:词尾锚定,用于单词模式的右侧;    grep "word\>"  \:匹配完整单词; 分组及引用:  \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;    \(xy\)*ab  Note:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录到内部的变量中,这些变量为:    \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;    \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符    \3  后向引用:引用前面的分组括号中的模式所匹配到的字符; 基本正则表达式元字符
练习

1
、显示/etc/passwd文件中不以/bin/bash结尾的行;  ~]# grep -v "/bin/bash$" /etc/passwd
2、找出/etc/passwd文件中的两位数或三位数;  ~]# grep "\" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;  ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4、找出"netstat -tan"命令的结果中以"LISTEN"后跟01或多个空白字符结尾的行;  ~]# netstat -tan|grep "LISTEN[[:space:]]*$"    He loves his lover.    He likes his lover.    She likes her liker.    She loves her liker.  ~]# grep  "\(l..e\).*\1"  lovers.txt

egrep命令: 


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


egrep [OPTINS] PATTERN [FILE]


选项:与grep选项相似


-G:支持基本正则表达式

扩展正则表达式的元字符:
  字符匹配:
    .:匹配任意单个字符
    []:匹配指定范围内的任意单个字符
    [^]:匹配指定范围外的任意单个字符
  次数匹配:
    *:匹配器前面的字符任意次:0,1,多次;
    .*:匹配任意长度的任意字符,贪婪模式,能匹配多长就匹配多长;
    ?:匹配其前面的字符0次或者1次;即其前面的字符可有可无的;
    +:匹配其前面的字符一次或多次;即其前面的字符出现至少1次;
    {m}:匹配其前面的字符m次;
    {m,n}:匹配其前面的字符至少m次,至多n次;
      {0,n}:至多n次;
      {m,}:至少m次;    
  位置锚定:
    ^:行首锚定;用于模式的最左侧;
    $:行尾锚定;用于模式的最右侧
    \或\b:词尾锚定,用于单词模式的锚定;
  分组及引用
    ():分组;括号内模式匹配到的字符会被记录到正则表达式引擎的内部变量中;
    后向引用:\1,\2....
  或:
    a|b:a或b
      C|cat:C或cat
      (c|C)at:cat或Cat
1、找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式;   
  grep "^[sS]" /proc/meminfo    
  grep -i "^sS" /proc/meminfo    
  grep -E "^(s|S)" /proc/meminfo    
  grep -E "^s|^S" /proc/meminfo        2、显示当前系统上root、centos或者user1用户的相关信息;   
  ~]# grep -E "^(root|centos|user1\>)" /etc/passwd   
3、找出/etc/rc.d/init.d/functions文件中某单词后跟一个小括号的行;   
  ~]# grep -Eo '_[[:alnum:]]+\(\)' /etc/rc.d/init.d/functions    4、使用echo命令输出一绝对路径,使用egrep取出基名;   
  echo "/root/ssf/erou/dfjl" | egrep -o "\$"   
  echo "/root/ssf/erou/dfjl" | grep -Eo "[^/]+/?$"   
5、找出ifconfig命令结果中的1-255之间的数值;    ifconfig | grep -oE "\"  
6、添加用户bash, testbash, basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;    ~]# grep  -E  "^([^:]+\>).*\1$"  /etc/passwd



    本文编号1995,以后想阅读这篇文章直接输入1995即可。

    ●本文分类Linux搜索分类名可以获得相关文章。

    ●输入m可以获取到文章目录

    本文内容的相关公众号推荐

    Linux学习

    C/C++


    更多推荐15个技术类公众微信

    涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。