• 正则和grep——再做正则就去死


    grep 文本过滤工具
    • 基本正则表达式
      • grep 语法
      • 基本正则表达式的元字符
      • 次数匹配
      • 位置锚定
      • 分组
    • 扩展正则表达式
      • 基本正则表达式的元字符
      • 次数匹配
      • 位置锚定
      • 分组
      • 或者
    1. grep的介绍
    2. linux上文本处理三剑客 grep:文本过滤(模式:pattern)作用: 把匹配到的行给予显示,没匹配到的行过滤掉。

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

    REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或匹配的功能:

    分两类:

    基本正则表达式:BRE

    扩展正则表达式:ERE

    grep -E,egrep (用来支持扩展正则表达式)

    正则表达式引擎:

    grep [OPTIONS] PATTERN [FILE...]

    grep语法选项:

    参数作用
    --color=auto 对匹配到的文本着色显示
    -v 显示能被正则匹配到的行
    -E 使用扩展正则表达式
    -o 仅显示匹配到的内容
    -q 不显示执行结果(静默模式)
    -A n 显示匹配到的内容和指定的后面n行。
    -B n 显示匹配到的内容和指定的前面n行。
    -C n 显示匹配到的内容和指定的前后面n行。
    -G n 使用基本正则表达式
    -f 使用固定字符串
    -p 使用perl的正则表达式

    基本正则表达式元字符 字符匹配

    参数作用
    . 匹配任意单个字符
    [] 匹配任意范围内单个字符
    [^] 匹配指定范围外的任意单个字符
    [:alnum:] 任意字母和数字
    [:alpha:] 任意大小写字母
    [:lower:] 任意小写字母
    [:upper:] 任意大写字母
    [:blank:] 空白字符[空格和制表符]
    [:space:] 水平和垂直的空白字符比blank更广
    [:digit:] 任意十进制数字

    [:digit:]|任意十六进制数字 [:punct:] |标点符号 [alex] | 匹配a,l,e,x这个四个字母

    次数匹配

    *:任意长度的任意字符:
        例:grep 'a.*y' grep.txt
    ?:匹配其前面的字符0或1次:即前面的可有可无:
        例:grep 'x?y' grep.txt
    +:匹配其前面的字符至少一次:
        例:grep 'x+y' grep.txt
        例:grep "xy+" grep.txt
    {m}:匹配前面的字符m次
        例:grep '[[:alpha:]]'[3]t' /etc/passwd
    {m,n}:匹配前面的字符至少m次,至多n次。
        例:grep '[:alpha:]' [1,3] /etc/passwd
    {0,n}:匹配前面的字符至多n次:
    |{m,}:匹配前面的字符至少m次。

    位置锚定

    ^:行首锚定:用于模式的最左侧
    
    $:行尾锚定:用于模式的最右侧
    
    ^PATTERN$:用于模式匹配整行:
    
    ^$:空行:
    
    ^[[:space:]]*$  空格行
    
    < 或  词首锚定:用于单词模式的左侧 
        例:grep '<[[:alpha:]][1,3]t' /etc/passwd 
    
    > 或  词尾锚定:用于单词模式的右侧 
        例:grep '[[:alpha:]][1,3]t>' /etc/passwd 
    
    <pattern>:匹配整个单词。

    分组

    分组:()将一个或多个字符捆绑在一起,当做一个整体进行处理,如:(root)+
    
    例:grep '([[:alpha:]]{1,3}t>).*1' /etc/passwd
    
    Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:1,2,3,...
    
    1表示从左侧器第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
    
    示例:   (string1+(string2))
                1: string1+(string2)*
                 2:string2 
    
    例:grep "(r..t).*1" /etc/passwd  # 表示前面r..t匹配到什么内容,1页必须匹配相对应的字符。
    
    例:useradd ruut -c buuh -s /bin/bu
    grep "(r..t).*(b..h).*1.*2" /etc/passwd
    
    后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
    egrep = grep -E
    
    egrep [OPTIONS][ATTERN [FILE...]
    
    扩展正则表达式的元字符:
    字符匹配:
    .   任意单个字符
    []  指定范围的字符
    [^] 不在指定范围的字符
    
    次数匹配    ;
    *:     匹配前面字符任意次
    ?:    0或1次
    +: 1次或多次
    {m}:   匹配m次
    {m,n}; 至少m,至多n次 
    
    位置锚定:
    ^: 行首
    $: 行尾
    <,:    语首
    >,:    语尾
    
    分组:
    ()
    后向引用:1,2,..
    
    或者
    a|b:   a或b
    C|cat:  C或cat
    (C|c)at :Cat或cat

    正则题目:

    1、显示/proc/meminfo文件中以大小s开头的行:(要求:使用两种方式)

    egrep '^[sS]' /proc/meminfo
    
    egrep -i ^'s' /proc/meminfo

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

    egrep -v "/bin/bash"$  /etc/passwd

    3、显示用户rpc默认的shell程序

    egrep '^rpc>' /etc/passwd |cut -d: -f7

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

    egrep "[[:digit:]]{2,3}" /etc/passwd

    5、显示centos7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行

    egrep "^[[:space:]]+[^[:space:]]+" /etc/grubu.cfg

    6、找出“netstat -tan” 命令的结果中以'LISTEN'后跟任意多个空白字符结尾的行

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

    7、显示centos7上所有系统用户的用户名和UID

    cut -d: -f1,3 /etc/passwd | egrep "[1-9]{1,3}$"

    8、找出/etc/passwd用户名同shell名的行

    egrep "^(.*):.*1$" /etc/passwd

    9、利用df和egrep,取出磁盘各分区利用率,并从大到小排序

    df -h | egrep -o "[[:digit:]]{1,2}%" | cut -d% -f1 |sort -r

    10、显示三个用户root、alex、wang的UID和默认shell

    egrep "^(root|alex|wang)>" /etc/passwd | cut -d: -f3,7

    11、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

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

    12、使用egrep取出/etc/rc.d/init.d/functions中其基名。

    echo "/etc/rc.d/init.d/functions/" | egrep -o "[^/]+/?$" | cut -d"/" -f1

    13、使用egrep取出上面的路径的目录名。

    echo "/etc/rc.d/init.d//functions" | egrep -o "^/.*[^ ]" | egrep -o "^.*/.*/?"

    14、统计last命令中以root登录的每个主机IP地址登录次数

    last | egrep -o "^root>.*[0-9].[0-9]{1,3}" |tr -s " " "%"|cut -d% -f3

    15、利用扩展正则表达式分别表示0-9 、10-99 、100-199、200-249 、250-255

    看不懂要求

    16、显示ifconfig 命令结果中所有IPv4 地址

    ifconfig  | egrep  -o "([0-9]{1,3}.){3}[0-9]{1,3}"
    #未去除172  255之类IP

    17、将此字符串:welcome to oldboy python 中的每个字符去重并排序,重复次数多的排到前面

    echo "welcome to  oldboy python" | egrep -o  "[[:alpha:]]" | sort  | uniq -c | sort -nr
  • 相关阅读:
    [na]ip数据包格式
    [js]浏览器同源策略(same-origin policy)
    [sql] 同库表(结构)的备份和sql聚合&navicat使用
    [svc]tcp三次握手四次挥手&tcp的11种状态(半连接)&tcp的time-wait
    [svc]ip地址划分
    [css]单/多行居中&字体设置
    时间戳转为C#格式时间
    windows 8 中 使用 httpclient
    oralce 查看是否启动 登陆 创建用户 常用命令小记
    SQL递归查询(with cte as)
  • 原文地址:https://www.cnblogs.com/songcheng/p/6685920.html
Copyright © 2020-2023  润新知