正则表达式与文本处理工具 脚本实战

正则表达式、文本处理工具与脚本基础

一、正则表达式

正则表达式分两类:python

  • ​ 基本正则表达式:BRE
  • ​ 扩展正则表达式:ERE

1.1 基本正则表达式元字符

1.1.1 字符匹配

.               匹配任意单个字符,能够是一个汉字
[]              匹配指定范围的任意单个字符,例如:[grain]    [0-9]   [a-z]
[^]             匹配指定范围外的任意单个字符,例如:[^grain]
[:alnum:]       字母和数字
[:alpha:]       表明任何英文大小写字母,即a-z,A-Z
[:lower:]       小写字母,至关于a-z
[:upper:]       大写字母
[:blank:]       空白字符
[:space:]       水平和垂直的空白字符
[:digit:]       十进制数字
……

1.1.2 匹配次数

用在要指定次数的字符后面,用于指定前面的字符要出现的次数git

*               匹配前面的字符任意次,包括0次
.*              任意长度的任意字符
\?              匹配其前面的字符0或1次
\+              匹配其前面的字符至少1次
\{n\}           匹配前面的字符n次
\{m,n\}         匹配前面的字符至少m次,至多n次
\{,n\}          匹配前面的字符至多n次,<=n
\{n,\}          匹配前面的字符至少n次

1.1.3 位置锚定

^               行首锚定,用于模式的最左侧
$               行尾锚定,用于模式的最右侧
^PATTERN$       用于模式匹配整行
^$              空行
^[:space:]$     空白行
\<              词首锚定,用于单词模式的左侧
\>              词尾锚定,用于单词模式的右侧
\<PATTERN\>     匹配整个单词

1.1.4 分组其它 或者

分组:()将多个字符捆绑在一块儿,看成一个总体处理,例如:\(root\)+正则表达式

后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名方式为:\1,\2,\3……, \1 表示从左侧起第一个左括号以及与之匹配右括号之间模式匹配到的字符shell

或者: \|vim

\(string1\(string2\)\)
\1: string1\(string2\)
\2: sting2

1.2 扩展正则表达式

1.2.1 字符匹配元字符

.               匹配任意单个字符,能够是一个汉字
[]              匹配指定范围的任意单个字符,例如:[grain]    [0-9]   [a-z]
[^]             匹配指定范围外的任意单个字符,例如:[^grain]
[:alnum:]       字母和数字
[:alpha:]       表明任何英文大小写字母,即a-z,A-Z
[:lower:]       小写字母,至关于a-z
[:upper:]       大写字母
[:blank:]       空白字符
[:space:]       水平和垂直的空白字符
[:digit:]       十进制数字
……

1.2.2 次数匹配

*               匹配前面字符任意次
?               0或1次
+               1次或屡次
{n}             匹配n次
{m,n}           至少m,至多n次

1.2.3 位置锚定

^               行首
$               行尾
\<,\b           词首
\>,\b           词尾

1.2.4 分组其它

()              分组
后向引用:\1,\2,...
|                  或者
a|b             #a或b
C|cat            #C或cat
(C|c)at         #Cat或cat

二、 文本处理之 grep

做用:文本搜索工具,根据用户指定的“模式”对目标逐行进行匹配检查,打印匹配到的行bash

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

格式:工具

grep [OPTIONS] PATTERN [FILE...]

常见选项:spa

--color=auto            对匹配到的文本着色显示
-m #                    匹配#次后中止
-v                      显示不被pattern匹配到的行
-i                      忽略字符大小写
-n                      显示匹配的行号
-c                      统计匹配的行数
-o                      仅显示匹配到的字符串
-q                      静默模式,不输出任何信息
-A #                    后#行
-B #                    前#行
-C #                    先后各#行
-e                      多个选项间逻辑or关系 如:grep -e 'cat' -e 'dog' file
-w                      匹配整个单词
-E                      使用ERE,至关于egrep
-f file                 根据模式文件处理
-r                        递归目录,但不处理软连接
-R                      递归目录,并处理软连接
[root@CentOS8 ~]#df | grep '/dev/sd'
/dev/sda2      104806400 2311224 102495176   3% /
/dev/sda5       52403200  402140  52001060   1% /data
/dev/sda1        1038336  172128    866208  17% /boot
[root@CentOS8 ~]#df|grep '^/dev/sd'|tr -s ' ' %|cut -d% -f5|sort -n|tail -1
17

三、 文本处理之 sed

格式:操作系统

sed [option]... 'script;script;...' inputfile...

经常使用选项:

-n          不输出模式空间内容到屏幕,即不自动打印
-e          多点编辑
-f file     从指定文件中读取编辑脚本
-r,-E       使用扩展正则表达式
-i          原处编辑,加后缀表明备份并编辑

script格式:

'地址命令'

地址格式:

1.  不给地址:   对全文进行处理
2.  单地址:
    #:指定的行, $:最后一行
    /pattern/:  被此处模式所匹配到的每一行
3.  地址范围:
    #,#         从#行到#行,3,6 从第3行到第6行
    #,+#        从#行到+#行,3,+4 从3行到第7行
4.  步长:~
        1~2 奇数行
        2~2 偶数行

命令:

p               打印当前模式空间内容,追加到默认输出以后
Ip              忽略大小写输出
d               删除模式空间匹配的行,并当即启用下一轮循环
a [\\]text      之指定行后面追加文本,支持使用\n实现多行追加
i [\\]text      在行前面插入文本
c [\\]text      替换行为单行或多行文本
w /path/file    保存模式匹配的行至指定文件
r /path/file    读取指定文件的文本至模式空间中匹配到的行后
=               为模式空间中的行打印行号
!               模式空间中匹配行取反
s/pattern/string/修饰符        查找替换,支持使用分隔符,也可使用:s@@@,s###
替换修饰符:
g       行内全局替换
p       显示替换成功的行
w /path/file    将替换成功的行保存到文件中
I,i     忽略大小写
[root@CentOS8 ~]#sed -n '1,4p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@CentOS8 ~]#

四、 文本处理之 awk

格式:

awk [OPTIONS] 'program' var=value file...
awk [OPTIONS] -f programfile var=value file...

说明:

program一般是被放在单引号中,并能够由三种部分组成

  • BEGIN语句块
  • 模式匹配的通用语句块
  • END语句块

常见选项:

  • -F “分隔符” 指明输入时用到的字段分隔符,默认是连续的空白符
  • -v var=value 变量赋值

Program格式:

pattern{action;...}

pattern:决定动做语句什么时候触发及触发事件,好比:BEGIN,END,正则表达式等

action:对数据进行处理,放在{}内指明,常见:print,printf

动做 print

格式:

print item1,item2,...

说明:

  • 逗号分隔符
  • 输出item能够是字符串,也能够是数值
  • 如省略item,至关于print $0
  • 固定字符须要用" "引发来,而变量和数字不须要
[root@CentOS8 ~]#awk -F: -v OFS=':' '/root/{print $1,$3,$7}' /etc/passwd
root:0:/bin/bash
operator:11:/sbin/nologin
[root@CentOS8 ~]#

五、 文本处理实例

  • 统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来
[root@CentOS8 ~]#echo `grep -v '/sbin/nologin' /etc/passwd |wc -l` && grep -v '/sbin/nologin' /etc/passwd | cut -d: -f1
12
root
sync
shutdown
halt
lee
num
number
mageia
slackware
user1
user2
user3
[root@CentOS8 ~]#awk '!/\/sbin\/nologin/{print $NF}' /etc/passwd | wc -l
12
[root@CentOS8 ~]#awk -F: '!/\/sbin\/nologin/{print $1}' /etc/passwd
root
sync
shutdown
halt
lee
num
number
mageia
slackware
user1
user2
user3
[root@CentOS8 ~]#echo `awk '!/\/sbin\/nologin/{print $NF}' /etc/passwd | wc -l` && awk -F: '!/\/sbin\/nologin/{print $1}' /etc/passwd
12
root
sync
shutdown
halt
lee
num
number
mageia
slackware
user1
user2
user3
[root@CentOS8 ~]#
  • 查出用户UID最大值的用户名、UID及shell类型
[root@CentOS8 ~]#awk -F: '{print $1,$3,$7}' /etc/passwd | sort -nr -k2|head -n1
nobody 65534 /sbin/nologin
[root@CentOS8 ~]#getent passwd | sort -t: -k3 -n|tail -n1|cut -d: -f1,3,7
nobody:65534:/sbin/nologin
  • 统计当前链接本机的每一个远程主机IP的链接数,并按从大到小排序
[root@CentOS8 ~]ss -nt | tail -n +2 | tr -s ' ' : | cut -d: -f6|sort|uniq -c|sort -nr
[root@CentOS8 ~]ss -nt | grep "^ESTAB" | tr -s ' ' : | cut -d: -f6|sort|uniq -c|sort -nr
[root@CentOS8 ~]ss -nt | awk -F" +|:" '/^ESTAB/{print $(NF-2)}' |sort|uniq -c | sort -nr

六、文本编辑 vim

6.1 vim三种模式和转换

三种常见模式:

  • 命令或普通模式: more模式,能够实现移动光标,剪切、粘贴文本
  • 插入或编辑模式:用于修改文本
  • 扩展命令或命令模式: 保存,退出等

命令模式 --> 插入模式

i   insert,在光标所在处插入
I   在当前光标所在行的行首输入
a   在光标所在处的后面输入
A   在当前光标所在行的行尾输入
o   在当前光标所在行的下方打开一个新行
O   在当前光标所在行的上方打开一个新行
  • 插入模式 --- Esc ---> 命令模式
  • 命令模式 --- : --- > 扩展命令模式
  • 扩展命令模式 --- Esc ,enter ---> 命令模式

6.2 扩展命令模式经常使用命令

w           写磁盘文件
wq          写入并退出
q!          不存盘退出
wq!         强制存盘退出
r file      读文件内容到当前文件中
w file      将当前文件内容写入另外一个文件
!command    执行命令
r!command   读入命令的输出

6.3 地址定界

/part1/,/part2/     #从第一次被part1匹配开始,一直到第一次被part2匹配结束
/pattern/           #从当前行向下查找,直到匹配pattern的第一行
%           #全文,至关于1,$
$           #最后一行
.,$-1       #当前行到倒数第二行
#           #第 # 行
#,#         #从左侧#起始行,到右侧#结束行

6.4 地址定界后跟一个编辑命令

d       #删除
y       #复制
w file  #指定范围的行另存至指定文件中
r file  #在指定位置插入指定文件中的全部内容

6.5 查找替换

格式

s/要查找的内容/替换的内容/修饰符
修饰符:
    i       #忽略大小写
    g       #全局替换,默认状况下,每一行只替换第一次出现
    gc      #全局替换,每次替换前询问
要查找的内容: 可以使用基本正则表达式
替换为的内容: 不能使用模式,可是可使用后向引用\1,\2,...等符号,还可使用 "&" 引用前面查找时查到的整个内容

6.6 定制vim工做特性

配置文件

/etc/vimrc      #全局
~/.vimrc        #我的

经常使用特性:

行号
    显示: set number, 简写 set nu
    取消显示:set nonumber,简写 set nonu
复制保留格式
    启用: set paste
    禁用: set nopaste
Tab用指定空格个数代替
    启用: set tabstop=# 指定#个空格代替Tab
    简写: set ts=#
光标所在行标识线
    启用: set cursorline,简写 set cul
    禁用: set nocursorline

6.7 命令模式

字符间跳转

​ h:左 l:右 j:下 k:上

单词间跳转

​ w: 下一个单词词首

​ e: 当前或下一个单词词尾

​ b: 当前或前一个单词词首

当前页跳转

​ H: 页首 M:页中间行 L:页底

​ zt:将光标所在当前行移到屏幕顶端

​ zz:将光标所在当前行移到屏幕中间

​ zb:将光标所在当前行移到屏幕底端

行首行尾跳转

​ ^ 第一个非空白字符

​ 0 行首

​ $ 行尾

行间移动

​ #G或 :# 跳转到#行

​ G 最后一行

​ 1G,gg 第一行

句间移动

​ )下一句 ( 上一句

翻屏操做

​ Ctrl+f 向文件尾部翻一屏 Ctrl+b 向文件首部翻一屏

​ Ctrl+d 向文件尾部翻半屏 Ctrl+u 向文件首部翻半屏

删除命令

​ d 删除,结合光标跳转能够实现范围删除

​ d$ 删除到行尾

​ d^ 删除到非空行首

​ dd 剪切光标所在行

​ #dd 多行删除

​ D:从当前光标位置一直删除到行尾,至关于d$

复制命令

​ y$ 复制

​ y0 复制到行尾

​ y^ 复制到非空行首

​ yy 复制行

​ #yy 复制多行

​ Y: 复制整行

查找:

/pattern: 从当前光标所在处向文件尾部查找

?pattern: 从当前光标所在处向文件首部查找

n: 与命令同方向

N: 与命令反方向

撤销更改:

u 撤销最近的更改

#u 撤销以前屡次更改

U 撤销光标落在这行后全部此行的更改

. 重复前一个操做

#. 重复前一个操做#次

七、shell脚本基础

shell脚本:包含一些命令或声明,并符号必定格式的文本文件

格式要求: 首行shebang机制

#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

7.1 脚本实例

  • 编写脚本disk.sh,显示当前硬盘分区中空间利用率最大的值
[root@CentOS8 script]#bash disk.sh
17
[root@CentOS8 script]#cat disk.sh
#!/bin/bash
df -h| awk -F" +|%" '/\/dev\/sd/{print $5}'|sort -nr|head -n1
  • 编写脚本 system_info.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操做系统版本,内核版本,CPU型号,内存大小,硬盘大小
[root@CentOS8 script]#cat system_info.sh 
#!/bin/bash
RED="\E[1;31m"
GREEN="echo -e \E[1;32m"
END="\E[0m"
$GREEN-------------------Host systeminfo--------------------$END
echo -e "HOSTNAME:  $RED`hostname`$END"
echo -e "IPADDR:    $RED`ifconfig ens33|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |head -n1`$END"
echo -e "OSVERSION: $RED`cat /etc/redhat-release`$END"
echo -e "KERNEL:    $RED`uname -r`$END"
echo -e "CPU:       $RED`lscpu|grep 'Model name'|tr -s ' '|cut -d: -f2`$END"
echo -e "MEMORY:    $RED`free -h|grep Mem|tr -s ' ' :|cut -d: -f2`$END"
echo -e "DISK:      $RED`lsblk|awk '/^sd/{print $1,$4}'`$END"
$GREEN------------------------------------------------------$END
[root@CentOS8 script]#