• Linux三剑客之grep 与 egrep


    grep:
    Linux上文本处理三剑客
    1 grep:文本过滤(模式:pattern)工具; *grep, egrep, fgrep2 sed:stream editor,文本编辑工具;
    3 awk:Linux上的实现gawk,文本报告生成器;

    grep: Global search REgular expression and Print out the line.

    作用:
    文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;
    模式:由正则表达式字符及文本字符所编写的过滤条件;
    REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能;
    分两类:
    基本正则表达式:BRE
    扩展正则表达式:ERE
    grep -E, egrep
     
    正则表达式引擎
     1 选项:
     2                             --color=auto: 对匹配到的文本着色显示;
     3                             -v: 显示不能够被pattern匹配到的行;
     4                             -i: 忽略字符大小写;
     5                             -o: 仅显示匹配到的字符串;
     6                             -q: 静默模式,不输出任何信息;
     7                             -A #:after, 后#行
     8                             -B #: before, 前#行
     9                             -C #:context, 前后各#行
    10 
    11                             -E:使用ERE;

    基本正则表达式元字符:

    字符匹配:

    .:  匹配任意单个字符;
    []: 匹配指定范围内的任意单个字符
    [^]:匹配指定范围外的任意单个字符
    [:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
     
    匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;
    *:匹配前面的字符任意次;
    例如: grep "x*y" 
    abxy
    xay
    xxxxxxy
     
    贪婪模式
    .*:任意长度的任意字符;
    ?:匹配其前面的字符0或1次;即前面的可有可无;
    +:匹配其前面的字符至少1次;
    {m}:匹配前面的字符m次;
    {m,n}:匹配前面的字符至少m次,至多n次;
    {0,n}:匹配前面的字符至多n次;
    {m,}:匹配前面的字符至少m次;
     
    位置锚定:
    ^:行首锚定;用于模式的最左侧;
    $:行尾锚定;用于模式的最右侧;
    ^PATTERN$: 用于模式匹配整行;
    ^$: 空行;
    ^[[:space:]]*$
     
    < 或 :词首锚定;用于单词模式的左侧;
    > 或 :词尾锚定;用于单词模式的右侧;
    <PATTERN>:匹配整个单词;
     
    分组:
    ():将一个或多个字符捆绑在一起,当作一个整体进行处理;
    (xy)*ab
     
    Note: 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: 1, 2, 3, ...
    1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
    (ab+(xy)*):
    1: ab+(xy)*
    2: xy
     
    后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)
    练习实例
    1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
    1 # grep '^{s|S}' /proc/meminfo
    2 # grep -i '^s'  /proc/meminfo

    2、显示/etc/passwd文件中不以/bin/bash结尾的行;

    1 # grep -v '/bin/bash$'  /etc/passwd

    3、显示/etc/passwd文件中ID号最大的用户的用户名;

    1 # sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1

    4、如果用户root存在,显示其默认的shell程序;

    1 # id root &> /dev/null && grep "^root>" /etc/passwd | cut -d: -f7

    5、找出/etc/passwd中的两位或三位数;

    1 # grep "<[0-9]{2,3}>" /etc/passwd

    6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行;

    1 # grep "^[[:space:]]+[^[:space:]]" /etc/rc.d/rc.sysinit

    7、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;

    # netstat -tan | grep "LISTEN[[:space:]]*$"

    8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;

    1 # grep "^([[:alnum:]]+>).*1$" /etc/passwd

    egrep及扩展的正则表达式

    egrep = grep -E

    扩展正则表达式的元字符:
    字符匹配:
    .
    []
    [^]
    次数匹配:
    *
    ?: 0或1次;
    +:1次或多次;
    {m}:匹配m次;
    {m,n}:至少m,至多n次;
    锚定:
    ^
    $
    <, 
    >, 
    分组:
    ()
     
    后向引用:1, 2, ...
    或者:
    a|b
    C|cat: C或cat
    练习实例
    1、显示当前系统root、centos或user1用户的默认shell和UID;
    1 # grep -E '^(root|centos|user1)>' /etc/passwd | cut -d: -f1,3,7

    2、找出/etc/rc.d/init.d/functions文件(centos6)中某单词后面跟一个小括号的行;

    # grep -E -o "^[_[:alpha:]]+()" /etc/rc.d/init.d/functions

    3、使用echo输出一绝对路径,使用egrep取出其基名;

    1 # echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
  • 相关阅读:
    fetch数据请求
    React exact路由精确匹配
    React Router中的Link和NavLink组件有什么区别?
    new FileReader() 文件上传
    git stash部分文件
    主机屋的免费云虚拟主机
    MySQL数据库默认的存储引擎类型是MyISAM并不支持事务的坑,要把存储类型改为InnoDB
    使用ExcelPackage,OfficeOpenXml做EXCEL导入时一个方法的坑,对应类的字段只能定义为string类型
    mysql两个关联表,同名字段同时返回时,原字段名写靠前的表的字段名会可以保留原字段名,靠后的会被自动as为(1)这样的,
    MySql 里的IFNULL、NULLIF和ISNULL用法-区别于MSSQL
  • 原文地址:https://www.cnblogs.com/maxtgood/p/6155964.html
Copyright © 2020-2023  润新知