• Linux-正则三剑客


    目录

    一、正则简介

    1.正则表达式分两类:

    2.正则表达式的意义

    二、Linux三剑客简介

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

    2.正则表达式分类

    3.基本正则表达式BRE集合

    4.扩展正则表达式ere集合

    三、grep

    1.简介

    2.实践

    3.贪婪匹配

    四、sed

    1.sed简介

    2.输出文件的第2,3行的内容

    5.替换

    6.写入对应行

    7.实例

    五、awk

    1.awk基础

    2.举例

    3.NF和NR

    4.字符串占位

    5.awk参数

    6.awk变量

    7.awk的分隔符

    8.awk的变量


    一、正则简介

    1.正则表达式分两类:

    基本正则表达式:BRE

    扩展正则表达式:ERE

    2.正则表达式的意义

    • 处理大量字符串
    • 处理文本

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

    通常Linux运维工作,都是面临大量带有字符串的内容,如:

    • 配置文件
    • 程序代码
    • 命令输出结果
    • 日志文件

    正则表达式应用广泛,Linux仅受三剑客(sed、awk、grep)支持,其他命令无法使用

    通配符是大部分普通命令都支持的,用于查找文件或者目录,而正则表达式 是通过三剑客命令在文件(数据流)中过滤内容。


    二、Linux三剑客简介

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

    • grep:文本过滤工具,(模式:pattern)工具
    • sed:stream editor,流编辑器:文本编辑工具
    • awk:Linux的文本报告生成器(格式化文本),Linux上是gawk

    2.正则表达式分类

    Linux三剑客主要分两类

    • 基本正则表达式(BRE)

    BRE对应元字符有^$.[]*

    • 扩展正则表达式(ERE)

    ERE在BRE基础上,增加上 (){}?+|等字符

    3.基本正则表达式BRE集合

    • 匹配字符
    • 匹配次数
    • 位置锚定

    4.扩展正则表达式ere集合

    扩展正则表达式必使用grep -E才能生效


    三、grep

    1.简介

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

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

    语法:

    2.实践

    cat /etc/passwd > ./passwd.txt grep -i "root" passwd.txt

    反选

    1. grep -i "root" passwd.txt -v -c
    2. root@ou-virtual-machine:~# grep -i "root" passwd.txt -v

    找空行

    grep '^$' passwd.txt -n

    过滤注释行

    grep '^#' passwd.txt -v -n

    或者

    grep '^[a-zA-Z]' passwd.txt -n

    匹配w+前一个任意字符,或者w+后一个任意字符

    1. grep 'w.' passwd.txt
    2. grep '.w' passwd.txt

    3.贪婪匹配

    grep ".*e" passwd.txt

    +号匹配1次或者多次

    grep -E "w+" passwd.txt -n

    复合实例


    四、sed

    1.sed简介

    sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。

    sed是操作、过滤和转换 文本内容的强大工具。

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

    由于sed还会输出没匹配到的字符行,我们需要-n来处理

    常用参数

    sed的内置命令字符用于文件进行不同的操作功能,如对文件增删改查

    sed常用内置命令字符:

    sed匹配范围

    2.输出文件的第2,3行的内容

    p为打印的意思

    sed -n '2,3p' passwd.txt

    如果不加-n那么不匹配的也会输出

    3.匹配root字符串

    sed -n '/root/p' passwd.txt

    4.删除的问题

    sed '/root/d' passwd.txt

    但是查看文件却发现root字符串所在的行还在文件内

    这里是因为sed删除的 是内存中的内容,并没有真正对文件内容进行操作。

    写入文件加-i

    5.替换

    sed "s/www/nihaoshijie/g" passwd.txt.bak

    但文件内容还是没用修改

    -i参数写入文件内

    sed "s/www/nihaoshijie/g" passwd.txt.bak -i

    多次替换

    sed -e "s/nihaoshijie/www/g" -e "s/test/wwwwwwwwwwwwwwwwwwwwww/g" passwd.txt.bak -i

    6.写入对应行

    sed "2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" passwd.txt.bak -i

    每行都加个分隔符

    sed "a ----------------------------------------------------" passwd.txt.bak -i

    7.实例

    拿出ip和子网掩码和广播地址

    ifconfig ens33 | sed "2p" -n | sed "s/^.*inet//"


    五、awk

    awk更像一门编程语言,支持条件判断、数组、循环等功能

    三剑客的各个特点

    • grep,擅长单纯的查找或匹配文本内容
    • awk,更适合编辑、处理匹配到的文本内容
    • sed,更适合格式化文本内容,对文本进行复杂处理

    三个命令称之为Linux的三剑客

    1.awk基础

    awk语法:

    awk [option] 'pattern[action]' file...

    awk 参数 '条件动作' 文件

    2.举例

    空格作为分隔符

    $0 代表一整行

    $1 代表第一列

    $2 代表第二列

    ...

    awk '{print $1}' 1.txt

    3.NF和NR

    1. awk '{print $NF}' 1.txt
    2. awk '{print $NR}' 1.txt

    NR显示文件第五行

    awk 'NR==5' 1.txt

    NR显示文件第二行到第五行

    1. root@ou-virtual-machine:~# awk 'NR==2,NR==5' 1.txt
    2. a6 a7 a8 a9 a10
    3. a11 a12 a13 a14 a15
    4. a16 a17 a18 a19 a20
    5. a21 a22 a23 a24 a25

    4.字符串占位

    输出默认不带分隔符

    1. root@ou-virtual-machine:~# awk '{print $1 $2 $3}' 1.txt
    2. a1a2a3
    3. a6a7a8
    4. a11a12a13
    5. a16a17a18
    6. a21a22a23
    7. root@ou-virtual-machine:~# awk '{print $1__$2__$3}' 1.txt
    8. a1a2a3
    9. a6a7a8
    10. a11a12a13
    11. a16a17a18
    12. a21a22a23

    逗号会默认加空格分隔符

    1. root@ou-virtual-machine:~# awk '{print $1,$2,$3}' 1.txt
    2. a1 a2 a3
    3. a6 a7 a8
    4. a11 a12 a13
    5. a16 a17 a18
    6. a21 a22 a23

    "字符串"分隔符

    1. root@ou-virtual-machine:~# awk '{print "1 List: "$1,"2 List: "$2,"3 List: "$3}' 1.txt
    2. 1 List: a1 2 List: a2 3 List: a3
    3. 1 List: a6 2 List: a7 3 List: a8
    4. 1 List: a11 2 List: a12 3 List: a13
    5. 1 List: a16 2 List: a17 3 List: a18
    6. 1 List: a21 2 List: a22 3 List: a23
    7. 1 List: 2 List: 3 List:

    5.awk参数

    前面的文件分隔符是空格,awk自动识别空格作为分隔符

    但是如果我们用其他的分割符,那么awk并不会自动识别

    1. root@ou-virtual-machine:~# cat 1.txt
    2. a1 a2 a3 a4 a5
    3. a6 a7 a8 a9 a10
    4. a11 a12 a13 a14 a15
    5. a16 a17 a18 a19 a20
    6. a21 a22 a23 a24 a25
    7. root@ou-virtual-machine:~# cat 1.txt.bak
    8. a1#a2#a3#a4#a5
    9. a6#a7#a8#a9#a10
    10. a11#a12#a13#a14#a15
    11. a16#a17#a18#a19#a20
    12. a21#a22#a23#a24#a25
    13. root@ou-virtual-machine:~# awk "{print $1}" 1.txt.bak
    14. a1#a2#a3#a4#a5
    15. a6#a7#a8#a9#a10
    16. a11#a12#a13#a14#a15
    17. a16#a17#a18#a19#a20
    18. a21#a22#a23#a24#a25

    通过-F来修改识别分隔符

    cat 1.txt.bak | awk -F"#" '{print $1}'

    小写f

    1. root@ou-virtual-machine:~# echo '"{print}"' > 1
    2. root@ou-virtual-machine:~# awk -f 1 1.txt
    3. a1 a2 a3 a4 a5
    4. a6 a7 a8 a9 a10
    5. a11 a12 a13 a14 a15
    6. a16 a17 a18 a19 a20
    7. a21 a22 a23 a24 a25

    6.awk变量

    取出本机的ip

    第一步先取出ifconfig第二行的数据

    ifconfig | awk 'NR==2{print $0}'

    ifconfig | awk 'NR==2{print $0}' | awk '{print $2}'

    7.awk的分隔符

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

    FS输入分隔符

    awk逐行处理文本的时候,以输入分隔符为准,把文本切成多个片段,默认符号是空格

    当我们处理特殊文件,没用空格的时候,可以自由指定分隔符

    awk -F '#' '{print $1}' 1.txt.bak

    修改默认输出符

    1. root@ou-virtual-machine:~# awk -F '#' '{print $1,$2,$4}' 1.txt.bak
    2. a1 a2 a4
    3. a6 a7 a9
    4. a11 a12 a14
    5. a16 a17 a19
    6. a21 a22 a24
    7. root@ou-virtual-machine:~# awk -F '#' -v OFS=': ' '{print $1,$2,$4}' 1.txt.bak
    8. a1: a2: a4
    9. a6: a7: a9
    10. a11: a12: a14
    11. a16: a17: a19
    12. a21: a22: a24
    13. : :
    14. root@ou-virtual-machine:~#

    8.awk的变量

    NR、NF和FNR变量

    1. [root@localhost ~]# awk -F "#" '{print NR,NF,$1,$2}' 1
    2. 1 5 a1 a2
    3. 2 5 a6 a7
    4. 3 5 a11 a12
    5. 4 5 a16 a17
    6. 5 5 a21 a22

    NR和FNR的区别

    1. [root@localhost ~]# awk -F "#" '{print FNR,$1,$2}' 1 1
    2. 1 a1 a2
    3. 2 a6 a7
    4. 3 a11 a12
    5. 4 a16 a17
    6. 5 a21 a22
    7. 1 a1 a2
    8. 2 a6 a7
    9. 3 a11 a12
    10. 4 a16 a17
    11. 5 a21 a22
    12. [root@localhost ~]# awk -F "#" '{print NR,$1,$2}' 1 1
    13. 1 a1 a2
    14. 2 a6 a7
    15. 3 a11 a12
    16. 4 a16 a17
    17. 5 a21 a22
    18. 6 a1 a2
    19. 7 a6 a7
    20. 8 a11 a12
    21. 9 a16 a17
    22. 10 a21 a22

    ORS和RS

    1. [root@localhost ~]# awk -F "#" '{print RS="-------",$1,$2}' 1
    2. ------- a1 a2
    3. ------- a6 a7
    4. [root@localhost ~]# awk -F "#" '{print ORS="-------",$1,$2}' 1
    5. ------- a1 a2-------------- a6 a7-------------- a11 a12-------------- a16 a17-------------- a21 a22-------[
    6. [root@localhost ~]#

    FILENAME

    数组

    默认数组

    1. [root@localhost ~]# awk "{print ARGV[0],$0}" 1
    2. awk 0
    3. awk 0
    4. awk 0
    5. awk 0
    6. awk 0
    7. [root@localhost ~]# awk "{print ARGV[1]}" 1
    8. 1
    9. 1
    10. 1
    11. 1
    12. 1
    13. [root@localhost ~]# awk "{print ARGV[2]}" 1
    1. [root@localhost ~]# awk '{print ARGV[0],ARGV[1],ARGV[2]}' 1 1
    2. awk 1 1
    3. awk 1 1
    4. awk 1 1
    5. awk 1 1
    6. awk 1 1
    7. awk 1 1
    8. awk 1 1
    9. awk 1 1
    10. awk 1 1
    11. awk 1 1
    12. [root@localhost ~]#

    自定义变量

    1. [root@localhost ~]# awk -v myname='o' 'BEGIN{print "myname=",myname}'
    2. myname= o
    3. [root@localhost ~]#

    9.awk格式化输出

    print和printf的区别

    printf需要自定义格式

    1. awk '{printf $0}' 1
    2. a1#a2#a3#a4#a5a6#a7#a8#a9#a10a11#a12#a13#a14#a15a16#a17#a18#a19#a20a21#a22#a23#a24#a25[root@localhost ~]#
    3. [root@localhost ~]#

    自定义格式

    1. [root@localhost ~]# printf "%s\n" a b c d e
    2. a
    3. b
    4. c
    5. d
    6. e
    1. [root@localhost ~]# awk 'BEGIN{printf "%s\n%s\n",1,2,3,4,5}'
    2. 1
    3. 2

    区别

  • 相关阅读:
    程序员健康防猝指南3:健康保健
    让人上瘾的新一代开发神器,彻底告别Controller、Service、Dao等方法
    Ubuntu安装PCAN-View
    第六章《类的高级特性》第4节:抽象类
    简述Redis事务实现
    【MySQL】慢SQL搜集工具、SQL脱敏聚合处理
    spring三级缓存
    3-egg-TS-通用后端管理注册系统-图形验证码
    Prometheus Operator 通过additional 添加target
    English语法_形容词/副词3级-最高级
  • 原文地址:https://blog.csdn.net/bmxch/article/details/133385969