zoukankan      html  css  js  c++  java
  • linux学习---正则表达式与grep

    正则表达式(Regular Expression(RE))

    是透过一些特殊字符的排列, 用以"搜寻/取代/删除"一列或多列文字字符串, 简单的说, 正则表达式就是用在字符串的处理上面的一项"表达式". 正则表达式并不是一个工具程序, 而是一个字符串处理的标准依据, 如果想要用用正则表达式处理字符串, 就要使用支持正则表达式的工具程序, 这样的程序有很多, 如vi, awk, grep, sed...

    grep

    基本规则:

    grep [-acinv] [--color=auto] '搜寻字符串' filename

    选项与参数:

      -a: 将binary档案以text档案方式搜寻数据

      -c: 计算找到'搜寻字符串'的次数

      -i: 忽略大小写

      -n: 输出行号

      -v: 反向选择, 即显示没有'搜寻字符串'内容的行

    示例

    1. 将last中, 出现root的那一行取出来

    last | grep 'root'

    2. 与1相反, 只要没有root的行

    last | grep -v 'root'

    3. 取出/etc/man.config内含MANPATH的那几行并显示行号

    grep --color=auto 'MANPATH' -n /etc/man.config

    加上--color=auto选项, 找到的关键词部分会用特殊颜色显示.

    进阶

    规则:

    grep [-A] [-B] [--color=auto] '搜寻字符串' filename

    选项与参数:

      -A: 后面可加数字, 为after的意思, 除了列出该行外, 后续的n行也列出来

      -B: 后面可加数字,为befer的意思, 除了列出该行外, 前面的n行也列出来

    示例

    1.

    dmesg | grep -n --color=auto 'eth'

    dmesg可列出核心产生的讯息, 透过grep取网络卡相关信息(eth).

    2. 承上题, 将关键词所在行的前俩行与后三行也一起显示:

    dmesg | grep -n -A3 -B2 --color=auto 'eth'

    3.利用中括号[]搜寻集合字符

    如果想要搜寻 test 或 taste 这两个单字时,可以发现,其实它们有共通的 't?st' 存在, 这个时候,
    我可以这样来搜寻:

    grep -n 't[ae]st' filename

    4.我们可以使用, 

    grep -n 'oo' filename

    来搜寻包含'oo'的行, 这样可能或搜寻一堆包含单词good, food...的行, 如果我们不想要'oo'前面有'g'呢? 这时可以用集合字符的反向选择[^]:

    grep -n '[^g]oo' filename

    如果不想要'oo'有小写字母, 我们可以这样写:

    grep -n [^a-z]oo' filename

    也就是说,对于连续的母或数字,可以这样写[a-z], [A-Z], [0-9].

     考虑到语系对对于编码顺序的影响, 所以连续编码除了使用'-'外, 上例也可以使用这样的方法:

    grep -n '[^[:lower:]]oo' filename

    其他的符号:

      [:alnum:] 代表英文大小写字符及数字,亦即 0-9, A-Z, a-z
      [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
      [:blank:] 代表穸格键不 [Tab] 按键两者
      [:cntrl:] 代表键盘上面的控制按键,亦卲包括 CR, LF, Tab, Del.. 等等
      [:digit:] 代表数字,亦即 0-9
      [:graph:] 除了空格符 (空格键不 [Tab] 按键) 外的其他所有按键
      [:lower:] 代表小写字符,亦即 a-z
      [:print:] 代表任何可以被打印出来的字符
      [:punct:] 代表标点符号 (punctuation symbol),亦即:" ' ? ! ; : # $...
      [:upper:] 代表大写字符,亦即 A-Z
      [:space:] 任何会产生空白的字符,包空格键, [Tab], CR 等等
      [:xdigit:] 代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字符

    行首与行尾符^$

    如果想找只在行首出现字符串'the'的行, 可以这样:

    grep -n '^the' filename

    如果需要开头是小写字母的行:

    grep -n '^[[:lower:]]' filename

    不想要开头是字母:

    grep -n '^[^a-zA-Z]' filename

    注意到^在[]内外意义是不同的, 在内表示反向选择, 在外表示定位在行首.

    如果想找行尾是'.'的行:

    grep -n '.$' filename

    要注意的是.需要转义字符.

    搜寻空白行:

    grep -n '^$' filename

    也就是说从行首到行尾没有东西.

    任意一个字符 . 不重复字符 *

    . (小数点): 代表"一定有一个任意字符"的意思

     * (星星号): 代表"重复前一个 0 到无穷多次"的意思,为组合形态

    示例:

    假设我需要找出含g??d 的字符串,亦即共有四个字符, 起头是 g而结束是 d ,我可以这样做:

    grep -n 'g..d' filename

    因为 * 代表的是"重复 0 个戒多个前面的 RE 字符"的意义, 因此,"o*"代表的是: "拥有空字符或一个 o 以上的字符"

    如果要查除有俩个g, 俩个g之间至少有一个以上的o字符串, 可以这样:

    grep -n 'goo*g' filename

    限定连续 RE 字符范围 {}

    我们需要限定一定范围以内的字符数, 例如俩个g内含有2个到5个o:

    grep -n 'go{2,5}g' filename

    2个以上的o:

    grep -n 'go{2,}g' filename

    总结

    ^word

    意义: 待搜寻的字符串(word)在行首!

    word$

    意义: 待搜寻的字符串(word)在行末

    .

    意义: 一定有一个任意字符

    ^word

    意义: 待搜寻的字符串(word)在行首!

    /

    意义: 转义字符

    *

    意义:重复零个到无穷多个癿前一个 RE 字符

    [ ]

    意义: 带搜寻字符集, 只从里面取一个

    [n1-n2]

    意义: 字符集合的RE 字符,里面列出想要撷取的字符范围

    [^list]

    意义:字符集合的RE 字符,里面列出不要的字符串或范围

    {n,m}

    意义:连续 n 到 m 个的前一个 RE 字符

    意义:若为 {n} 则是连续 n 个的前一个 RE 字符

    意义:若是 {n,} 则是连续 n 个以上的前一个 RE 字符

    <完>

  • 相关阅读:
    python无意中发现的
    mysql 中关于周和月份的表示
    列表表达式
    python编码
    bugfree安装
    python练习题代码
    根据用户名或者厂商名称生成相关的弱口令
    获取QQ企业邮箱通讯录PY脚本
    SQL注入POC
    乌云精华漏洞爬取匹配
  • 原文地址:https://www.cnblogs.com/ezhengnan/p/3738267.html
Copyright © 2011-2022 走看看