shell脚本正则表达式与文本处理器

在任何脚本中正则表达式都是无法避开的话题,但是呢其内容丰富且繁杂,因为它们很强大,强大也就意味着它们的复杂程度高,掌握有难度,因此本篇会将其常用的书写方式列出供大家需要时有个参考,

先把正则表达式是什么说一下;简单来说就是一种匹配字符串的方法,通过一些特殊字符号,实现快速查找,并可以进行修改。概念很简单,但是内容却不简单。

正则表达式

三大工具:grep sed awk

在进行列举之前可以创建实验文本来满足接下来的需求,列举出的命令中的“test”与“test.txt”字样的皆以你创建的实验文本名称为准。实验文本如下:

he was short and fat.
he was weating a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
PI=3.14
a wood cross!
Actions speak louder than words

#woood #
#woooooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
grep:较为常用的命令。经常结合管道符对其他命令的输出做过滤,再过滤方面,greo是较为强大的。
  • grep

    • 针对过滤的工具

      • grep -ni 'the' test

        • 目的:将包含the的行显示出,忽略大小写并显示行号

        • -n 显示行号

        • -i 忽略大小写

        • -v 反向选择

        • 显示结果

          [root@localhost ~]# grep -ni 'the' test
          3:The home of Football on BBC Sport online.
          4:the tongue is boneless but it breaks bones.12!
          5:google is the best tools for search keyword.
          
      • grep -n 'sh[io]rt' test

        • 目的:查找以sh开头和rt结尾,中间的一个字符为i或o的行,显示并显示行号。

          • 显示结果

            [root@localhost ~]# grep -n 'sh[io]rt' test
            1:he was short and fat.
            2:he was weating a blue polo shirt with black pants.
        • 注意事项

          • 注意”[ ]“ 内只匹配一个字符

      • grep -n '[^w]oo' test

        • 目的:查找”oo”前不是字符w的行

          • 显示结果

            [root@localhost ~]# grep -n '[^w]oo' test
            3:The home of Football on BBC Sport online.
            5:google is the best tools for search keyword.
            10:#woood #
            11:#woooooooood #
            13:I bet this place is really spooky late at night!
            
          • 如果将w换成a-z 那么显示的是“oo”前不是小写的行

            • 显示结果

              [root@localhost ~]# grep -n '[^a-z]oo' test
              3:The home of Football on BBC Sport online.
              
        • 注意事项

          • ^在[ ]内表示排除,取反

          • ^在[ ]外表示开头

      • grep -n '^the' test

        • 目的:查找行首为the的行

        • 显示结果

          [root@localhost ~]# grep -n '^the' test
          4:the tongue is boneless but it breaks bones.12!
      • grep -n '^[^a-zA-Z]' test

        • 目的

          • 显示非字母开头的行

        • 显示结果

          [root@localhost ~]#  grep -n '^[^a-zA-Z]' test
          10:#woood #
          11:#woooooooood #
          
      • grep -n '^$' test

        • 目的:查询空行

        • 显示结果

          [root@localhost ~]# grep -n '^$' test
          9:
          
        • 显示非空行取反即可

      • grep -n 'w..d' test

        • 目的:显示w与d中间包含两个任意字符的行

          • “.”代表任意单个字符

          • 显示结果

            [root@localhost ~]#  grep -n 'w..d' test 
            5:google is the best tools for search keyword.
            7:a wood cross!
            8:Actions speak louder than words
            
      • grep -n 'w.*d' test

        • 目的:显示以w开头和以d结尾中间字符不限制数量的行

        • 显示结果

          [root@localhost ~]#  grep -n 'w.*d' test
          1:he was short and fat.
          5:google is the best tools for search keyword.
          7:a wood cross!
          8:Actions speak louder than words
          10:#woood #
          11:#woooooooood #
          
      • grep -n '[0-9][0-9]' test

        • 目的:显示包含两个数字的行

        • 显示结果

          [root@localhost ~]#  grep -n '[0-9][0-9]*' test
          4:the tongue is boneless but it breaks bones.12!
          6:PI=3.14
          
        • [0-9]表示一个数字

      • grep -n 'ooo*' test

        • 目的:显示至少包含两个“oo”的行

          • “ooo*” 前两个oo表示参数为两个o o*表示oo后可以包含0个或任意个

        • 显示结果

          [root@localhost ~]# grep -n 'ooo*' test
          3:The home of Football on BBC Sport online.
          5:google is the best tools for search keyword.
          7:a wood cross!
          10:#woood #
          11:#woooooooood #
          13:I bet this place is really spooky late at night!
          
      • grep -n 'o\{2\}' test

        • 目的:显示包含两个o的行的另一种表达

        • 显示结果

          [root@localhost ~]#  grep -n 'o\{2\}' test
          3:The home of Football on BBC Sport online.
          5:google is the best tools for search keyword.
          7:a wood cross!
          10:#woood #
          11:#woooooooood #
          13:I bet this place is really spooky late at night!
          
        • 结果与“ooo*”相同

      • grep -n 'wo\{2,5\}d' test

        • 目的:显示以w开头,以d结尾,中间包含2到5个o的行

        • 显示结果

          [root@localhost ~]#  grep -n 'wo\{2,5\}d' test
          7:a wood cross!
          10:#woood #
          
        • 如果显示两个以上,逗号后不加数字即可

怎么样感觉是不是有很多选项,能适用绝大多数场景。

sed:(文本流数据处理工具)

这个工具也很强大,grep只是过滤查看,而这个工具可以直接对文本进行编辑,不需要交互动作,因此被广泛的使用在脚本编写的过程中。

那么请往下看。。。

  • sed

    • 文本解析转换处理工具,可对文本进行免交互的修改,因此被广泛的应用在shell脚本中,

    • 工作过程

      • 读取

        • 从输入流读取数据储存到缓冲区(模式空间)

      • 执行

        • 默认情况下sed的操作都在模式空间中执行

      • 显示

        • 将修改后的内容输出,发送后模式空间会被清空

    • 常用选项

      • -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

      • -e :直接在命令列模式上进行 sed 的动作编辑;

      • -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;

      • -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)

      • -i :直接修改读取的文件内容,而不是输出到终端。

    • 常用操作符

      • a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)

      • c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行

      • d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;

      • i :插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

      • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行

      • s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行

    • 查询

      • sed -n 'p' test

        • 目的:打印出该文件所有内容

      • sed -n '3p' test

        • 目的:将第三行输出

        • 扩展:显示3~5行把3换成3,5即可

      • sed -n 'p;n' test——p打印,n下一行

        • 目的:显示奇数行

        • 扩展:显示偶数行将操作符换位置即可如n;p

      • sed -n '1,5{p;n}' test

        • 目的:显示1~5之间的奇数行

        • 扩展:比如说显示10行后到末尾的偶数行:sed -n '10,${n;p}' test

      • sed -n '/the/p' test

        • 目的:输出包含the的行

      • sed -n ' 4,/the/p' test

        • 目的:输出从第四行到末尾包含the的行

      • sed -n '/the/=' test ——"="表示行号

        • 目的:显示包含the的行的行号

      • sed -n '/\/p' test

        • 目的:显示包含wood的行

        • 注意转义符“\”的使用

    • 修改操作

      • 删除

        • nl test.txt | sed '3d'

          • 目的:显示行号并把第三行删除

            • 通常与nl连用更加直观

        • 由于篇幅原因这里附上选项图

        • shell脚本正则表达式与文本处理器_第1张图片

        • 5,注意转义符的使用

          3,!表示不包含,排除的意思
      • 替换

        • shell脚本正则表达式与文本处理器_第2张图片

          • 4,注意删除的写法

          • 5,6,插入字符的的写法

          • 8,注意如果要全局替换要用g

      • 迁移

        • 迁移用到的操作符

          • H:复制到剪切板

          • g:将剪切板中的内容覆盖到指定行

          • G:将剪切板中的内容追加到指定行

          • w:保存文件

          • r:读取指定文件

          • a:追加指定内容

        • shell脚本正则表达式与文本处理器_第3张图片

          • 3,注意将文件内容迁移到别的文件的写法

          • 4,注意将别的文件迁移到本文件的方法

          • 7,注意添加多行内容换行用的式n

 awk:扩展的正则表达式,经常与grep连用达成想要的效果。

由于篇幅原因这里就只列出命令与含义,具体的效果可以自己去执行看看效果。

  • awk

    • awk工具常用的字符串含义

      • $0           表示整个当前行

      • $1           每行第一个字段

      • NF          字段数量变量

      • NR          每行的记录号,多文件记录递增

      • FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始

      • \t            制表符

      • \n           换行符

      • FS          BEGIN时定义分隔符

      • RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)

      • ~            匹配,与==相比不是精确比较

      • !~           不匹配,不精确比较

      • ==         等于,必须全部相等,精确比较

      • !=           不等于,精确比较

      • &&      逻辑与

      • ||             逻辑或

      • +            匹配时表示1个或1个以上

      • /[0-9][0-9]+/   两个或两个以上数字

      • /[0-9][0-9]*/    一个或一个以上数字

      • FILENAME 文件名

      • OFS      输出字段分隔符, 默认也是空格,可以改为制表符等

      • ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕

      • -F'[:#/]'   定义三个分隔符

    • 具体使用情况很多,根据需要自查,主要看要求与书写格式,如下:

      • 按行来处理

        • awk -F":" '{print}' /etc/passwd //输出所有

        • awk -F":" '{print $0}' /etc/passwd //输出所有

        • awk -F: 'NR==3,NR==6{print}' /etc/passwd //显示第3行到第6行

        • awk -F: 'NR>=3&&NR<=6{print}' /etc/passwd       //显示第3行到第6行

        • awk -F: 'NR==3||NR==6{print}' /etc/passwd       //显示第3行和第6行

        • awk '(NR%2)==1{print}' /etc/passwd //显示奇数行

        • awk '(NR%2)==0{print}' /etc/passwd //显示偶数行

        • awk '/^root/{print}' /etc/passwd //显示以root开头的行

        • awk '/nologin$/{print}' /etc/passwd //显示以nologin结尾的行

        • awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd //统计以/bin/bash结尾的行数

        • awk 'BEGIN{RS=""};END{print NR}' /etc/ssh/sshd_config //统计以空行分隔的文本段落数

        • awk '{print NR,$0}' /etc/passwd                                 //输出每行的行号

        • awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd      //依次打印行号,字段数,最后字段值,制表符,每行内容

        • awk -F: 'NR==5{print}'  /etc/passwd                         //显示第5行

        • route -n|awk 'NR!=1{print}'                                       //不显示第一行

        • awk -F: '{print NF}' /etc/passwd                                //显示每行有多少字段

        • awk -F: '{print $NF}' /etc/passwd                              //将每行第NF个字段的值打印出来

        •  awk -F: 'NF==4 {print }' /etc/passwd                       //显示只有4个字段的行

        • awk -F: 'NF>2{print $0}' /etc/passwd                       //显示每行字段数量大于2的行

      • 按段来处理

        • awk -F":" '{print $3}' /etc/passwd //显示第三列

        • awk -F":" '{print $1 $3}' /etc/passwd                       //$1与$3相连输出,无空格,

        • awk -F":" '{print $1,$3}' /etc/passwd                       //多了一个逗号,输出第1和第3个字段,有空格

        • awk -F: '$2=="!!" {print}' /etc/shadow //统计密码为空的shadow记录

        • awk 'BEGIN {FS=":"}; $2=="!!" {print}' /etc/shadow ##显示密码为空的用户的shadow信息

        • awk -F ":" '$7~"/bash" {print $1}' /etc/passwd ##显示第七个字段为/bash的行的第一个字段

        • awk -F: 'NR==5{print}' /etc/passwd                         //显示第5行

        • awk -F":" '{print $1 " " $3}' /etc/passwd                  //$1与$3之间手动添加空格分隔

      • 用管道符。双引号调用shell命令

        • awk -F: '/bash$/{print | "wc -l"}' /etc/passwd ##统计bash用户的个数

        • awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}' ##统计在线用户的数量

        • awk 'BEGIN {"hostname" | getline;print $0}' ##输出当前主机名

        • awk -F: '$1~/mail/ && $3>6 {print }' /etc/passwd         //逻辑与,$1匹配mail,并且$3>6

        • awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd

        • awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd 

        • awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd       //逻辑或,统计以mail开头或第3列大于1000的行

正则表达式到这里基本就已经完结,接下来有个小的板块,文本处理器,平时针对文件内容也只能根据系统自动帮你排序,接下来几种工具可以让你自己去把握。 

  • 文本处理器

    • 常用命令

      • sort

        • 排序工具

        • 常用选项

          •  -f:忽略大小写;

          •  -b:忽略每行前面的空格;

          • -M:按照月份进行排序;

          •  -n:按照数字进行排序;

          •  -r:反向排序;

          • -u:等同于 uniq,表示相同的数据仅显示一行;

          •  -t:指定分隔符,默认使用[Tab]键分隔;

          •  -o <输出文件>:将排序后的结果转存至指定文件;

          •  -k:指定排序区域。

      • uniq

        • 排序工具

        • 忽略重复选项

          • 常用选项

            • -c:进行计数;

            • -d:仅显示重复行;

            •  -u:仅显示出现一次的行

      • tr

        • 对标准输入进行替换压缩删除

          • 应用“防盗链”

        • 常用选项

          •  -c:取代所有不属于第一字符集的字符;

          •  -d:删除所有属于第一字符集的字符;

          •  -s:把连续重复的字符以单独一个字符表示;

          •  -t:先删除第一字符集较第二字符集多出的字符。

以上呢就是shell脚本正则表达式与文本处理器的所有内容,以上仅作参考需求使用。如有任何疑问,下方留言,看到会及时回复。那么再见! 

 

你可能感兴趣的:(正则表达式)