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表示判断

  • 相关阅读:
    Uva 10779 collector's problem
    poj 2728 最优比率树(最小生成树问题)
    LA 3126 二分图匹配 最小路径覆盖
    poj 1149 最大流构图
    Step By Step(Java XML篇)
    Step By Step(Java 输入输出篇)
    Step By Step(Java 集合篇)
    Step By Step(Java 线程篇)
    Step By Step(Java 反射篇)
    Step By Step(Java 国际化篇)
  • 原文地址:https://www.cnblogs.com/my-first-blog-lgz/p/13753522.html
Copyright © 2011-2022 走看看