Linux正则表达式

Posted 出水芙蓉薇薇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux正则表达式相关的知识,希望对你有一定的参考价值。

一、正则表达式的意义

      处理大量的字符串

      处理文本

      通过特殊符号的辅助,让Linux管理员快速过滤、替换、处理所需要的字符串、文本,让工作高效。

二、Linux三剑客

      文本处理工具,均支持正则表达式引擎

      grep:文本过滤工具(模式:pattern)

      sed :stream editor,流编辑器,文本编辑工具

      awk :Linux的文本报告生成器(格式化文本),Linux上是gawk

三、基本正则表达式BRE集合

      匹配字符

      匹配次数

      位置瞄定  

四、扩展正则表达式ERE集合

      扩展正则必须用grep -E才能生效

五、grep命令

      作用:文本搜索工具,根据用户指定的模式(过滤条件),对目标文本逐行进行匹配检查,打印匹配到的行

      模式:由正则表达式的元字符及文本字符所编写的过滤条件。

      语法:grep [options] [pattern] file

        

  grep命令实践

 注:^:表示以某字符为开头

        .:表示任意0或者多个字符

       .* :表示匹配所有内容

        .*o:一直到字母o结束(匹配到相同字符到最后一个字符的特点,称之为贪婪匹配)

        [a-z]:匹配所有小写单个字母

        [A-Z]:匹配所有单个大写字母

        [a-zA-Z]:匹配所有的单个大小写字母

        [0-9]:匹配所有单个数字

        [a-zA-Z0-9]:匹配所有数字和字母

 扩展正则表达式grep -E

      +号:表示匹配前一个字符1次或者多次,必须用grep -E扩展正则

      ?号:表示匹配前一个字符0次或者1次

      | 符:或者的意思

    ())小括号:将一个或者多个字符捆在一起,当做一个整体进行处理

      注:小括号功能之一是分组过滤被括起来的内容,括号内的内容表示一个整体

              括号()内的内容可以被后面的”\\n“正则引用,n表示数字,表示引用第几个括号的内容

              \\1:表示从左侧起,第一个括号中的模式所匹配到的字符

               \\2:表示从左侧起,第二个括号中的模式所匹配到的字符

      {n,m}匹配次数:重复前一个字符的各种次数,可以通过-o 参数显示明确的匹配过程

 

 

 

 六、sed命令

    sed是字符流编辑器,简称流编辑器。sed是操作、过滤和转换文本内容的强大工具

    常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中,最常用的两大功能是过滤(过滤指定的字符串)、取行(取出指定的行)

   语法:sed 【选项】 【sed内置命令】【输入文件】

   选项:

 

   内置命令符(用于对文件进行不同的操作功能)

   sed匹配的范围

   注:sed要实现grep的过滤效果,必须把要过滤的内容放在双斜杠中

           sed想要修改文件内容,必须用参数-i

           s内置符配合g,代表全局替换,中间的“/”可以替换成“#@/”等

 

 

 

 

 

    示例:取出Linux的ip 地址(去头去尾法)

  通过shell脚本生成的账号密码格式如下:

 

  svn服务的配置文件中的密码及账号格式如下:

 

  使用sed命令将shell脚本生成的账号密码,转换成SVN服务的配置文件中的账号及密码格式

 

 sed内置命令N的作用:不会清空模式空间的内容,并且从输入文件中读取下一行数据,追加到模式空间中,两行数据以换行符\\n连接。

七、awk命令

    awk有强大的文本格式化的能力。支持条件判断、数组、循环等功能。

    grep:擅长单纯的查找或匹配文本内容

    awk:更适合编辑、处理匹配到的文本内容

    sed :更适合格式化文本内容,对文本进行复杂处理

    awk 语法:awk [option]  \'pattern[action]\'  file ...

    awk 参数 ‘条件动作’ 文件

  

    action指的是动作,awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作是print和printf

    awk 默认以空格为分隔符,且多个空格也识别为一个空格,作为分隔符。awk按行处理文件,一行处理完毕,处理下一行,根据用户指定的分隔符工作,没有默认空格。

    指定了分隔符后,awk把每一行切割后的数据对应到内置变量中。

    

     $0:表示整行

     $NF:表示当前分割后的最后一列

     $(NF-1):表示倒数第二列

  1. awk内置变量

     awk可以自动定义输出内容。awk 必须外层单引号,内层双引号。内置变量都不得添加双引号,否则会被识别为文本。

  2. awk参数

  3. awk实践

 

  

 

 

 

 

4. awk分隔符

    输入分隔符:awk默认是空格,空白字符,变量名是FS

    输出分隔符:简称OFS

    处理特殊文件时,如果没有空格,可以自由指定分隔符特点

    除了使用-F 选项,还可以使用变量的形式,指定分隔符,使用-v选项搭配,修改FS变量

    awk 执行完命令,默认用空格隔开每一列,这个空格就是awk的默认输出符

    输出分隔符与逗号:awk添加逗号,默认是空格分隔符

    修改分隔符,改为\\t(制表符,四个空格)或者任意字符

5. awk变量

    awk参数

    变量分为:内置变量和自定义变量

    内置变量:NR、NF、FNR,其中NR、NF是不用添加符号$,而$0,$1,$2...是需要添加$符号的

    内置变量:RS——RS变量作用是输入分隔符,默认是回车符,也就是换行符。也可以定义#为行分隔符,每遇见一个#,就换行处理。

    内置变量:ORS—ORS是输出分隔符,awk默认每一行结束了,就得添加回车换行符,ORS可以更改输出符

   内置变量FILENAME——显示awk正在处理文件的名字

   变量ARGC、ARGV——ARGV表示的是一个数组,数组中保存的是命令行所给的参数。

   自定义变量:方法一(-v varName=value)方法二,在程序中直接定义

 

 

6. awk格式化

  printf格式化输出,需要指定format,format用于指定后面的每个item的输出格式。printf语句不会自动打印出换行符。format格式的指示符都以%开头,后跟一个字符。printf修饰符:-:表示左对齐;默认是右对齐;+:显示数值符号;printf "%+d"

  printf对输出的文本不会换行,必须添加对应的格式替换符和\\n

  使用printf动作,‘{printf  "%s\\n",$1}’ 替换的格式和变量之间得有逗号。%d %s等替换符必须和被格式化的数据一一对应。

7. awk模式pattern

    特殊的pattern:BEGIN和END

    BEGIN:是处理文本之前需要执行的操作

    END:是处理完所有行之后要执行的操作

    awk默认是按行处理文本,如果不指定任何模式(条件),awk默认一行行处理。如果指定了模式,只符合模式的才会被处理。

   awk模式

   awk和sed命令使用正则表达式,必须把正则放入‘//’中,匹配到结果后执行动作。

   awk命令执行流程

   awk \'BEGIN{commands} pattern { commands} END{commands} \'

   优先执行BEGIN{}模式中的语句;然后执行pattern{commands}进行匹配,找到了执行命令;最后当awk读取文件数据流的结尾时,会执行END{commands}

 

 

 

awk实战统计企业nginx日志ip数量

使用awk函数功能实现,将文件中的/sbin/nologin替换成/bin/bash

 使用了awk里面的查找功能,即gsub函数。

 gsub的格式:gsub("替换对象“,”替换成什么内容“,哪一列)

 注:

 gsub与后面的括号之间不能有空格

 替换对象、替换成什么内容以及哪一列之间要用逗号分隔开

 替换对象的外面要有双引号或者双斜线包裹起来,即”替换对象“或/替换对象/

 替换成什么内容就只能用双引号包裹起来,即”替换成什么内容“

 最后一个是哪一列,这个是可以省略的,省略的时候表示要替换整行内容,相当于写上了$0.

以上是关于Linux正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Linux正则表达式教程:Grep Regex示例

Linux正则表达式及grep命令

linux-正则表达式

linux正则表达式

linux 中 ^[^abc] 正则表达式啥意思

Linux 基础正则表达式