正则表达式、文本处理工具与脚本基础
1、正则表达式
正则表达式分两类:
- 基本正则表达式: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 匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括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 表示从左侧起第一个左括号以及与之匹配右括号之间模式匹配到的字符
或者: \|
\(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
2、 文本处理之 grep
作用:文本搜索工具,根据用户指定的“模式”对目标逐行进行匹配检查,打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
格式:
grep [OPTIONS] PATTERN [FILE...]
常见选项:
--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
3、 文本处理之 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 ~]#
4、 文本处理之 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 ~]#
5、 文本处理实例
- 统计出/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
6、文本编辑 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 撤销光标落在这行后所有此行的更改
. 重复前一个操作
#. 重复前一个操作#次
7、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]#