正则表达式grep,sed,awk 3.23

1.通配符

  * 匹配字符0个或多个

 匹配任意一个字符

 [..] 匹配括号中出现的任意一个字符

  [!..] 不匹配括号内出现的任意一个字符

2.基本正则表达式元字符

  (1)字符匹配

      . 匹配任意单个字符

      [] 匹配指定范围内任意单个字符

      [^] 匹配指定范围外的任意单个字符

      [[:digit:]] 数字

      [[:lower:]] 小写

      [[:upper:]] 大写

      [[:alpha:]] 字母

      [[:alnum:]] 数字字母

      [[:space:]] 空格

      ()|   re(a|b|c)d 等价于re[abc]d

   (2)匹配次数

       * 匹配前面的字符任意次

       .* 任意长度任意字符

       \? 匹配前面的字符串0次或1次

       \+ 匹配前面的字符至少一次

       \{m\} 匹配前面字符m次

       \{m,n\} 匹配前面字符至少m,至多n次

    (3)位置锚定

        ^ 行首锚定

        $ 行尾锚定

        ^pattern$ 用于匹配整行

        ^$ 空行

        \< 词首锚定

        \> 词尾锚定

        \<pattern\> 匹配整个单词

     (4)分组

           \(xy\) 将xy作为一组

           后向引用:引用分组括号中匹配的字符串

           \1 :从左侧起,第一个左括号与右括号之间的模式所匹配的字符

 3.grep与正则表达式

      -a 将binary文件以text文件的方式搜寻数据

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

      -i 忽略大小写

      -n 输出行号

      -v 显示没有匹配的行

--color=auto 将找到的关键字部分加上颜色

例:grep ‘\(3\)\.[0-9].*\1  *\1’testfile

 第一个字符3,接一个.任意一个数字,任意个任意字符,3,tab键,3

 4.sed与正则表达式

     一次处理一行内容,处理时把当前行放在缓冲区,不改变原文件内容

     sed [options] ‘address command’file

(1)   address

StartLine,Endline   1,100

/RegExp/            /^root/

/pattern1/,/pattern2/ 第一次被pattern1开始至第一次被pattern2匹配到的行结束

LineNumber 指定行

StartLine,+N   从StartLine开始,向后N行

       (2)command

             d  删除符合条件的行

p  显示符合条件的行

c  取代,可以取代n1,n2之间的行

         a\“String” 在指定的行后追加新行,内容为String

         i:\String  在指定的行前面追加新行,内容为String

         r FILE  将指定的文件的内容添加至符合条件的行处

         w FILE  将指定范围内的内容另存至指定的文件中

           s/pattern/string/修饰符 (g:全局替换 i:忽略大小写 &引用匹配到的串)

    (3)options

         -n 只有经过sed处理的行才会被列出来

         -e [Script] –e [Script] 可以同时执行多个脚本

         -f [filename] 可以执行filename内的sed

         -r 支持延伸的正规表示法语法

         -i 直接修改读取的档案内容,而不是由屏幕输出

    例:

         sed ‘1,2d’ab 删除第一行到第二行

         sed –n ‘2,$p’ab 显示第二行到最后一行

         sed –n ‘/ruby/p’ab 查询ruby所在的所有行

         sed ‘1a drink tea’ab 第一行后面添加字符串“drink tea”

         sed ‘1a drink tea\n or coffee’ab 第一行后添加两行

         sed ‘1,2c Hi’ab 第一行到第二行代替为Hi

        

 5.awk与正则表达式

     (1)awk [option] ‘program’file

         -F  指定分隔符

         -v:var=value 自定义变量

         -f scriptfile 从脚本文件中读取awk命令

      (2)awk脚本

          awk BEGIN{commands}pattern{commands} END{commands}

1>  执行BEGIN{commands}语句块中的语句

2>  从文件读取一行,执行pattern{commands}语句块,从第一行到最后一行直至文件全部读取完毕

3>  当读至输入流末尾时,执行END{commands}语句块

 

      (3)awk内置变量

          $n 当前记录的第n个字段

          $0 包含执行过程中当前行的文本内容

          FS 字段分隔符

          NF 对应于当前的字段数 $NF表示最后一个字段

          NR 表示记录数,在执行过程中对应当前的行号

          OFS 输出字段分隔符(默认值是一个空格)

          RS 输入时的换行符

          ORS 输出记录分隔符(默认值是一个换行符)

       例:

           打印每一行的第二和第三个字段

           awk ‘{print $2,$3}’filename

           统计文件中的行数

           awk ‘END{print NR}’filename

      (4)将外部变量值传递给awk

           var=100000

           echo| awk –v VARIABLE=$var ‘{printVARIABLE}’

           另一种传递外部变量的方法

           var1=“aaa”

           var2=“bbb”

           echo|awk ‘{print v1,v2}’v1=$var1v2=$var2

       (5)运算符

          1> 算数运算符

           + - 加减

          * / &

           ^ ***  求幂

           ++ --  增加或减少 作为前缀或后缀

           所有用作算数运算符进行操作,操作数自动转为数值,非数值都变为0

          2> 逻辑运算符

           ||

           &&

          3> 正则运算符

            ~  匹配正则表达式

            ~不匹配正则表达式

            例:awk ‘BEGIN{a=“100testa”;if(a ~ /^100*/){print “ok”}}’ok

       (6)awk输入输出

             next 跳过当前行,处理下一行

             awk ‘NR%2==1{next}{print NR,$0;}’text.txt

             将结果输出到一个文件

             awk ‘{printf(“hello word!n”)>“datafile”}’(或>>

 

         (7)输出

             1> print item1,item2,…

                 逗号隔开

                 item可以省略,意思是print$0,显示整行

     2> printfFORMAT,item1,item2…

         FORMAT必须给出来

         printf不会自动换行,需给出\n

         FORMAT需为后面每个item指定一个格式化符号

            %c  显示ASII码

            %d  显示十进制整数

            %e 科学计数法

            %f 浮点数

            %s 显示字符串

            %u 显示无符号整数

            %% 显示%自身

- 左对齐 + 显示字符的符号

awk –F :‘{printf“username:%-15suid:%d\n”,$!,$3}’/etc/passwd

          (8)关联数组array[index-expression]

               字符串要使用双引号

               当数组元素不存在时,awk会自动创建此元素并初始化为空

               数组中是否存在某元素,使用index in array 判断

            例

 awk‘BEGIN{weeks[“mon”]=“monday”;weeks[“tue”]=“tursday”;for(i in weeks) printweeks[i]}’

netstat –tan |awk ‘/^tcp/>/{state[$NF]++}END{for(I in state){print i ,state[i]}}’

        (9)内置函数

            1> rand() 0到1之间的随机数

            2> length() 字符串长度

            3> split(string,array,field separator)

               将一个字符串分隔为单词并存储在数组中

               time=“12:34:56”

               out=`echo $time | awk‘{split($0,a,“:”);printa[1],a[2],a[3]}’`

               echo $out

             4> substr截取字符串

                substr(s,p)返回字符串s中从p开始的后缀部分

             substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分

           5>根据扩展名切分文件名

              1> ${var%.*} 非贪婪

                 从${var}中删除位于%右侧的通配符所匹配的字符串,从右向左匹配

                 var=“sample.jpg”输出sample

              2> ${var%%.*}贪婪

                 从右向左匹配最长的字符串

                 var=“hack.fun.book.txt”

                 echo ${var%.*} hack.fun.book

                 echo ${var%%.*} hack

               3> 非贪婪,从左到右匹配

                 Var=“hack.fun.book.txt”

                 Echo ${var#*.} fun.book.txt

                 Echo ${var##*.} txt

猜你喜欢

转载自blog.csdn.net/weixin_41661222/article/details/79793352