zoukankan      html  css  js  c++  java
  • 正则表达式

    转至:https://www.cnblogs.com/tui463/archive/2004/01/13/12199909.html

    正则表达式

    定义:使用单个字符串来描述或匹配一系列符合某个句法规则的字符串

    在很多文本编辑器或其他工具里,正则表达式通常用来检索和替换那些符合某个模式的文本内容

    grep工具的使用

    # grep [-cinvABC]  'word'  filename

      -c   表示打印符合要求的行数

      -i   表示忽略大小写

      -n   表示输出符合要求的行及其行号

      -v   表示打印不符合要求的行

      -A   后面跟一个数字(有无空格都可以),表示打印符合要求的行以及下面n行

      -B   后面跟一个数字,表示打印符合要求的行以及上面n行

      -C   后面跟一个数字,表示打印符合要求的行以及上下各n行

    过滤出带有某个关键词的行,并输出行号

    # grep -n 'root' /etc/passwd

    过滤出不带有某个关键词的行,并输出行号

    # grep -nv 'nologin' /etc/passwd

    过滤出所有包含数字的行

    # grep '[0-9]' /etc/inittab

    (只要有一个数字就算匹配到了)

    过滤出所有不包含数字的行

    # grep -v '[0-9]' /etc/inittab

    (和上一例的结果正好相反,只要是包含一个数字,就不显示)

    过滤掉所有空行和以#开头的行

    编辑一个文件

    # vi /etc/sos.conf

    # grep -v '^#' /etc/sos.conf |grep -v '^$'

    ^表示行的开始,$表示行的结尾,^$表示空行

    过滤出不以英文字母开头的行

    编辑一个文件

    # mkdir /tmp/1/
    # vi /tmp/1/test.txt

    #  grep '^[^a-zA-Z]' /tmp/1/test.txt

    ^表示除[ ]内字符之外的字符

    # grep '[^a-zA-Z]' /tmp/1/test.txt

    过滤出任意一个字符和重复字符 

    # grep 'r.o' /etc/passwd

    .表示任意一个字符,r.o表示把r和o之间有一个任意字符的行过滤出来

    #  grep 'ooo*' /etc/passwd

    *表示零个或多个*前面的字符

    #  grep '.*' /etc/passwd |wc -l

    .*表示零个或多个任意字符,空行也包含在内

    不加 |wc -l 表示把符合要求的行都列出来

    指定要过滤出的字符出现次数 

    # grep 'o{2}' /etc/passwd

    符号{ }内部为数字,表示前面的字符要重复的次数,{ }左右都需要加上转义字符

    egrep工具的使用 

    egrep是grep的扩展,可以完成grep不能完成的工作

    编辑一个文件

    # vi /tmp/1/test.txt

    过滤出一个或多个指定的字符 

    # egrep 'o+' /tmp/1/test.txt
    # egrep 'oo+' /tmp/1/test.txt
    # egrep 'ooo+' /tmp/1/test.txt

    +符号表示匹配1个或多个+前面的字符

    #  egrep 'o{2}' /etc/passwd

    可以直接使用{ },不用加转义符号

    过滤出零个或一个指定的字符 

    # egrep 'o?' /tmp/1/test.txt
    # egrep 'ooo?' /tmp/1/test.txt   
    # egrep 'oooo?' /tmp/1/test.txt

    过滤出字符串1或者字符串2 

    # egrep 'aaa|111|ooo' /tmp/1/test.txt

    ()的应用 

    # egrep 'r(oo|at)o' /tmp/1/test.txt

    ()表示一个整体,会把包含rooo或者rato的行过滤出来

    #  egrep '(oo)+' /tmp/1/test.txt

    把()和其他符号组合在一起,表示一个或多个

    sed工具的使用 

    sed工具是流式编辑器,是针对文档的行来操作的

    打印某行

    -n 表示只显示我们要打印的行,无关紧要的内容不显示

    # sed -n '2'p /etc/passwd

    单引号内数字表示第几行

    # sed -n '1,$'p /tmp/1/test.txt

    把所有行都打印出来

    # sed -n '1,3'p /tmp/1/test.txt

    指定区间打印

     

    打印包含某个字符串的行 

    # sed -n '/root/'p /tmp/1/test.txt
    # sed -n '/^1/'p /tmp/1/test.txt
    # sed -n '/in$/'p /tmp/1/test.txt
    # sed -n '/r..o/'p /tmp/1/test.txt
    # sed -n '/ooo*/'p /tmp/1/test.txt

    # sed -e '1'p -e '/111/'p -n /tmp/1/test.txt

    -e    实现多个行为

    删除某些行 

    只是删除显示内容,文档内容不会改变

    # sed '1'd /tmp/1/test.txt
    # sed '1,3'd /tmp/1/test.txt
    # sed '/oot/'d /tmp/1/test.txt

    d   表示删除,不仅可以删除指定的单行以及多行,而且可以删除匹配某个字符的行

    替换字符或者字符串 

    # sed '1,2s/ot/to/g' /tmp/1/test.txt

    s  表示替换

    g  表示本行全局替换 

    除了可以使用 / 作为分隔符外,还可以使用其他特殊字符

    # sed 's#ot#to#g' /tmp/1/test.txt
    # sed 's@ot@to@g' /tmp/1/test.txt

    删除文档中的内容 

    # sed '/[0-9]//g' /tmp/1/test.txt

    删除文档中的所有数字

    # sed 's/[a-zA-Z]//g' /tmp/1/test.txt

    删除文档中的所有字母

    调换两个字符串的位置 

    # sed 's/(rot)(.*)(bash)/321/' /tmp/1/test.txt

    () 属于特殊符号,必须在前面加转义字符

    #  sed -r 's/(rot)(.*)(bash)/321/' /tmp/1/test.txt

    -r 省略转义字符

    # sed 's/^.*$/123&/' /tmp/1/test.txt 

    在某一行前后增加指定内容

    直接修改文件内容 

    # sed -i 's/ot/to/g' /tmp/1/test.txt

    -i   直接修改文件中内容

    awk工具的使用 

    awk也是流式编辑器,针对文档中的行来操作。awk兼具sed的所有功能,而且更加强大

    截取文档中的某个段

    # head -n2 /tmp/1/test.txt |awk -F':' '{print $1}'

    -F  指定分隔符,后面紧跟单引号

    print 表示打印,用来打印某个字段,要用{}括起来

    $1 表示第一个字段

    # head -n2 /tmp/1/test.txt |awk -F':' '{print $0}'

    $0 表示整行

    # head -n2 /tmp/1/test.txt |awk -F ':' '{print $1"#"$2"#"$3"#"$4}'

    打印自定义内容

    匹配字符或者字符串 

    # awk '/oo/' /tmp/1/test.txt

    # awk -F ':' '$1~/oo/' /tmp/1/test.txt

    ~表示匹配,可以让某个段匹配

    #  awk -F ':' '/root/ {print $1,$3} /test/ {print $1.$3}' /tmp/1/test.txt

    可以多次匹配

    条件操作符 

    # awk -F ':' '$3=="0"' /etc/passwd

    == 表示等于,精准匹配

    # awk -F ':' '$3>=500' /etc/passwd

    打印uid大于500的行

    # awk -F ':' '$7!="/sbin/nologin"' /etc/passwd

    !=表示不匹配

    # awk -F ':' '$3<$4' /etc/passwd

    在两个段之间进行逻辑比较

    # awk -F ':' '$3>"5" && $3<"7"' /etc/passwd

    &&表示“并且”

    # awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd

    ||表示“或者”

    awk的内置变量

    # head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}'

    OFS用来定义分隔符,在输出的时候定义

    # head -n3 /etc/passwd |awk -F ':' '{print NF}'

    NF表示用分隔符分隔后一共有多少段

    # head -n3 /etc/passwd |awk -F ':' '{print $NF}'

    $NF是最后一段的值

    # head -n3 /etc/passwd |awk -F ':' '{print NR}'

    NR表示行号

    # awk 'NR>10' /etc/passwd

    NR可以作为判断条件

    # awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd

    NR也可以配合段匹配一起使用

    awk中的数学运算

    # head -n 3 /etc/passwd |awk -F ':' '$1="root"'

    更改段值

    # head -n2 /etc/passwd |awk -F ':' '{$7=$3+$4; print $0}'

    对各个段的值进行数学运算

    # awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd

    计算某个段的总和

    END是awk特有的语法,表示所有的行都已经执行

    # awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd

    if表示判断

  • 相关阅读:
    《我也能做CTO之程序员职业规划》之十五: 智商
    《.Net 软件设计新思维:像搭积木一样搭建软件》成书背后的故事
    测试有道:微软测试技术心得
    GTUG 推荐这本书给大家
    测试有道:微软测试技术心得
    独具匠心的好书:评《构建高性能Web站点》
    敏捷软件开发模型SCRUM
    JSP和Servlet性能优化
    软件项目管理的圣经人月神话(中)
    探讨JAR文件无限可能性
  • 原文地址:https://www.cnblogs.com/my-first-blog-lgz/p/13753522.html
Copyright © 2011-2022 走看看