shell正则表达式

作者: 狼之足迹 | 来源:发表于2016-08-16 14:36 被阅读342次

    正则定义

    规定一些特殊语法表示字符类,数量限定符,位置关系,然后用这些特殊语法和普通字符一起表示亿额模式,这就是正则表达式

    正则三要素

    字符类
    数量限定符
    位置限定符

    正则中使用单引号保证内部字符不被shell解释掉

    字符类

    .  匹配任意一个字符
    [] 匹配括号中的任意一个字符
    -  在[]中表示字符范围
    ^ 位于[]内的开头,表示匹配除了括号中字符外的任意一个字符
    [[:xxx:]] grep工具预定义的一些命名字符类 eg alpha字  digit 数字

    数量限定符

    ?前边字符0-1次
    +前边字符1-多次
    *前边字符0-多次
    {n}前边单元N次.匹配满足就返回,也可能后边重复多余N次
    {n,}至少n次
    {m,n}m到n次,也可能多余n次..可以增加$结尾限制

    位置限定符

    ^匹配行首位置
    $行尾位置
    \<匹配单词开头位置
    \>匹配单词结尾位置
    \b匹配单词开始或者结尾位置
    \B匹配非单词开头和结尾的位置

    其他特殊字符

    \ 转义
    ()将整个正则表达式组成一个单元,使用数量限定符
    | 连接两个子表达式,表示或的关系

    注:以上为grep正则表达式的extended规范,base也有,但是字符?+{}\()解释为普通字符,要表示上述含义需要加\转义.-E同理

    sed

    基本概念:sed是一种流式编辑器(stream idter)

    基本格式

    sed option -f scriptfile file1 file2
    sed option 'script' file1 file2

    sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文 件然后用-f参数指定,编辑命令的格式为

    /pattern/action

    sed是一种在线编辑器,每次处理一行内容.每次处理将当前行放入缓存"模式空间",模式空间处理完成后移动到屏幕

    格式

    1. /pattern/p :打印匹配pattern的行    P(print)  sed -n  '111' log  相当于grep,默认会打印一遍原文以及匹配项
    2. /pattern/d :删除匹配pattern的行    D(delete)
    3. /pattern/s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2
    4. /pattern/s/pattern1/pattern2/g:查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2
    eg:  sed   '/^t/s/Z/--&--/g'   log
    将log文件中所有的t字符开始的(正则狮)行中的Z替换为--Z--,,,&符号表示匹配pattern1的字符串
    sed '/^[0-9]/s/\([0-9]*\)/~\1~' log
    将0-9开始的,0-9*替换为~0-9~   .因为sed默认使用basic正则,所以()需要转义,   -r使用extended
    pattern2中的\1表示与pattern1的第一个括号匹配的内容.\2表示与pattern1中第二个括号匹配的内容

    5.sed -i 做的修改会先修该原文
    6.定址:用于据定对哪些行进行编辑.地址形式可以是数字,正则或者二者结合.如果没有定制,那么sed处理所有的行
    eg
    sed -n  '3p' file  打印第三行
    sed -n '100,300p' fiile 打印[100,300]行
    sed '/start/, /end/d' file 删除start 和end行之间的行

    7.命令和选项
    sed命令告诉sed如何处理由地址指定的各输入行,如果没有指定则处理所有的输入行

    命令:
    a\在当前行后添加一行或者多行,多行,每行需要用"\"续行
    c\用次符号厚的新闻本替换当前行的文本 .....\
    i\在当前行中插入文本,......
    h吧模式空间李的内容赋值到暂存缓冲区
    H吧模式空间的内容追加到暂存...
    g复制,覆盖缘由内容
    G追加
    I列出非打印字符
    p打印行

    q结束或退出sed
    r从文件读取输入行
    !对所选行意外的所有行应用名林
    s替换
    g行内进行全局替换
    w将所选行写入文件
    x交换暂存缓冲区与模式空间的内容
    y将字符替换为另一个字符

    选项

    -e进行多项编辑
    -n取消默认的输出
    -f指定sed脚本的文件名

    正则表达式
    ^行首定位
    $行尾定位
    . 除换行以外的单个字符
    *匹配0-多个前导字符
    []任意一个
    [^ ]取反
    \(..\) 定义元祖标签,之后可以使用\1  \2 ... \9引用
    &保存查找串以便替换中引用.
    \< \>词头词尾
    x\{m\} 连续m个x
    ...
    ...

    awk

    sed以行为单位处理文件,awk更强,还能以列伪单位处理文件.

    行分割缺省换行

    列分割缺省连续空格和tab.

    分割符也可以自己定义

    命令基本形式

    awk option 'script'  file1 file2
    swk option -f scriptfile file1 file2

    /pattern/{actions}

    如果每日有pattern部分,那么所有行都执行actions部分.

    自动变量$1 $2 ... 分别表示第1列................... $0 表示整个当前行

    awk有类似的print语句,还有两个特殊变量condition-BEGIN和END  
    BEGIN后边的句子在整个文件之前执行一次,END之后的句子在整个文件之后执行一次

    搜索 -F

    awk -F: '/root/' /etc/passwd

    调用方式

    1命令行方式

    awk[-F field-separator] 'commands' input-file(s)

    commands是awk命令,[-F 域分割符]是可选的. input-file是待处理文件

    2shell脚本方式

    #!/bin/awk -f
    BEGIN{
      count1=0;
      count2=0;
    }
    {
    if($1<100)
       count1++;
    }
    else{
       count2++;
    }
    END{
    printf("%d",count2);
    }

    3将所有的awk命令插入一个单独文件,然后调用:

    awk -f awk-script-file input-file(s)

    awk调用正则表达式

    A.awk语句:

    awk '/REG/{action}'

    B.awk正则运算语句(~,~! 等同! ~)

    C.awk内置使用正则表达式函数

    gsub(Ere,Reql,[In])
    sub(Ere,Reql,[In])
    match(string,Ere)
    split(sting,A,[Ere])

    awk内置变量&&杂项

    ARGC
    ENVIRON
    FILENAME
    FNR 浏览文件的记录数
    FS 等价-F
    NF浏览记录的域的个数
    NR已读的记录数
    OFS输出域分隔符
    ORS输出记录分隔符
    RS控制记录分隔符
    $0 整条记录
    $1...$.. 第n个域

    print
    printf 和c语言printf类似

    awk进阶

    1循环(类C)

    2条件(类C)

    3数组  下标键值

    CUT

    在文件中负责剪贴数据,以每一行为一个处理对象

    剪贴依据(三个定位方式)

    字节(bytes) -b
    cut -b 1-3  file      #按照字节剪贴1-3个字符

    字符(characters) -c

    域(fields) -f
    -d指定域分割符,-f指定检出哪几个域
    cut -d: -f 1-2,5 /etc/passwd

    sort

    按照字符ascii排序

    -u去除重复行

    -r将默认升序修改为降序

    -o将结果重定向写入文件,可以指定到源文件

    -n以数字方式排序而非码拍.

    -t 设定分隔符, -k指定分割之后的列.实现第k列排序

    -f忽略大小写比较

    -c检查是否已排序,如果乱序,输出第一个乱序的行的相关信息.返回1

    -C检查,如果未排序,返回1

    -M以 月份方式排序

    -b忽略空白

    uniq

    去除重复

    -c显示输出中,在每行行首加上本行出现次数,取代-u,-d

    -d只显示重复行

    -u只显示不重复

    tcpdump

    strace

    archlinux

    gento

    相关文章

      网友评论

        本文标题:shell正则表达式

        本文链接:https://www.haomeiwen.com/subject/moousttx.html