本章结构
正则表达式
基础正则表达式
扩展正则表达式
文件处理器
sed
awk
sort
uniq
tr
正则表达式概述
- 正则表达式,又称正规表达式、常规表达式
- 使用字符串来描述、匹配一系列符合某个规则的字符串
- 正则表达式组成
1、普通字符
大小写字母、数字、标点符号及-些其他符号
2、元字符
在正则表达式中具有特殊意义的专用字符 - 正则表达式层次
1、基础正则表达式
2、扩展正则表达式 - Linux中文本处理工具
1、grep
2、egrep
3、sed
4、awk
基础正则表达式元字符
- 基础正则表达式是常用的正则表达式部分
- 除了普通字符外,常见到以下元字符
1、\:转义字符,\ ! 、\ n 等
2、^: 匹配字符串开始的位置
例:^a 、 ^the 、 ^#
3、$: 匹配字符串结束的位置
例: word $
4、.:匹配除\n之外的任意的一个字符
例:go.d 、 g…d - 常见元字符(续)
1、:匹配前面子表达式0次或者多次
◆例: good、 go.*d
2、[list]:匹配list列表中的一 个字符
◆例: go[ola]d, [abc]、 [a-z]、 [a-z0-9]
3、[^ list]:匹配任意不在list列表中的一一个字符
◆例: [^a-z]、 [^0-9]、 [^A-Z0-9]
4、{n,m)}:匹配前面的子表达式n到m次,有{n}、 {n,\}.
{n, m\}三种格式
◆例: go{2}d、 go{2,3}d、 go{2,}d
[root@localhost ~]# echo ABC/0 | grep ^[a-zA-Z0-9]
ABC/0
[root@localhost ~]# echo 522dd/0 | grep ^[a-zA-Z0-9]
522dd/0
[root@localhost ~]# echo 522dd/0 | grep ^[^a-zA-Z0-9]
[root@localhost ~]# echo 522dd/0 | grep ^[^a-zA-Z0-9]
[root@localhost ~]# echo /522dd/0 | grep ^[^a-zA-Z0-9]
/522dd/0
[root@localhost ~]# echo good | grep "go\{1,3\}d"
good o字符的一个到三个
[root@localhost ~]# echo good | grep "go\{1\}d"
[root@localhost ~]# echo god | grep "go\{1\}d"
god 最少一个
[root@localhost ~]# echo good | grep "go\{,1\}d"
[root@localhost ~]# echo good | grep "go\{,2\}d"
good 至多两个
[root@localhost ~]# echo goood | grep "go\{,2\}d"
[root@localhost ~]# echo good | grep "\<g"
good 以g开头的字符串
[root@localhost ~]# echo good | grep "d\>"
good 以d结尾的字符串
[root@localhost ~]# echo good | egrep "go+d"
good o至少出现一次
[root@localhost ~]# echo goodfoodcool | egrep "good|cool"
goodfoodcool 含有good或者cool 的字符串
[root@localhost ~]# echo goodfoodcool | egrep "go(ol|od)"
goodfoodcool 包含 以go后面为ol或od的字符串
[root@localhost ~]# echo goodfoodcool | grep -E "go(ol|od)"
goodfoodcool
[root@localhost ~]# echo godgoigdigosgosd | egrep "g.{1}d"
godgoigdigosgosd 查找g和d之间至少一个字符
[root@localhost ~]# egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.94.100
NETMASK=255.255.255.0
GATEWAY=192.168.94.2
DNS1=114.114.114.114
DNS2:1114.1114.1114.1114 查看本机网卡任意
[root@localhost ~]# egrep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.94.100
NETMASK=255.255.255.0
GATEWAY=192.168.94.2
DNS1=114.114.114.114 过滤掉 DNS2:1114.1114.1114.1114
Sed 流编辑器
sed工具概述
- 文本处理工具,读取文本内容,根据指定的条件进行处
理,如删除、替换、添加等 - 可在无交互的情况下实现相当复杂的文本处理操作
- 被广泛应用于Shell脚本,以完成自动化处理任务
- sed依赖于正则表达式
工作原理
sed命令的格式
- sed 选项 ‘动作’ 文件名
- cat 文件名 | sed 选项 '动作
选项:
- -n :只显示被修改的行的内容
- -e :直接在命令列模式上进行 sed 的动作编辑;
- -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
- -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
- -i :直接修改读取的文件内容,而不是输出到终端。
动作:
- a :在指定行后 新增一行或多行内容
- c :替换指定行的内容
- d :删除指定行的内容
- i :在指定行之前 插入一行或多行内容
- s :替换指定内容
[root@localhost ~]# sed '' zz.txt 打印文本
[root@localhost ~]# sed 'p' zz.txt 对文本逐行打印
[root@localhost ~]# sed -n 'p' zz.txt 只输出不打印
[root@localhost ~]# sed -n '1,3p' zz.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin 打印1-3行
[root@localhost ~]# cat -n zz.txt | sed -n '1,3p'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
打印1-3行并显示行号
[root@localhost ~]# cat -n zz.txt | sed -n '$p' 打印最后一行
10 ROOT:x:0:0:root:/root:/bin/bash
[root@localhost ~]# cat -n zz.txt | sed -n '1,+4p'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 1p:x:4:7:1p:/var/spoo1/1pd:/sbin/nologin
打印1-5行内容
[root@localhost ~]# cat -n zz.txt | sed -n '1~2p'
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 1p:x:4:7:1p:/var/spoo1/1pd:/sbin/nologin
7 rot:x:0:0:rot:/rot:/bin/bash
9 roooot:x:0:0:roooot:/roooot:/bin/bash
间隔两行打印 ,打印奇数行
[root@localhost ~]# cat -n zz.txt | sed -n '2~2p' 间隔两行打印,打印偶数行
[root@localhost ~]# sed -n '/^root\|bash$/p' zz.txt
打印以root开头 或 以bash结尾的行
[root@localhost ~]# sed -n '2p;4p' zz.txt 打印2、4 行
[root@localhost ~]# sed -ne '2p' -e '4p' zz.txt 有多条命令输入,满足任意一个都可以输出
[root@localhost ~]# sed -n '/ /p' zz.txt 打印有空格的行
[root@localhost ~]# cat -n zz.txt | sed -n '/ROOT/Ip'
1 root:x:0:0:root:/root:/bin/bash
10 ROOT:x:0:0:root:/root:/bin/bash
打印含有ROOT的行,忽略大小写
[root@localhost ~]# sed -n '/^root\|nologin$/p' zz.txt |是扩展元字符,需要转义
[root@localhost ~]# sed -n -r '/^root|nologin$/p' zz.txt -r在不转义的时候使用,等同于转义
[root@localhost ~]# sed -ne '/^root/p' -e '/nologin$/p' zz.txt -e为或的意思
[root@localhost ~]# sed -n '/^$/p' zz.txt 打印空行
[root@localhost ~]# sed -n '/ /p' zz.txt 打印有空格的行
[root@localhost ~]# sed '/\\/p' zz.txt 打印有\的行
[root@localhost ~]# sed '/\/bin\/bash/p' zz.txt 打印/bin/bash的行
[root@localhost ~]# sed '/\/bin\/bash/ccc/p' zz.txt 查找并替换
[root@localhost ~]# sed -n 's/ROOT/XXX/pi' aa.txt 替换的时候忽略大小写,默认第一个
[root@localhost ~]# sed -n 's/ROOT/XXX/gpi' aa.txt 全部替换并忽略大小写
[root@localhost ~]# sed -n 's/[0-9]/x/gp' aa.txt 把数字全部替换成x
[root@localhost ~]# sed '/root/cxxxx' aa.txt //c为整行替换,c后面的东西都是要替换的东西
[root@localhost ~]# sed ' = ' aa.txt 打印行号
[root@localhost ~]# sed -n ' = ' aa.txt 不输出打印,只显示行号
[root@localhost ~]# sed -n '$ = ' aa.txt 打印最后一行的行号
[root@localhost ~]# sed -n '$ =;3p ' aa.txt 打印第三行内容,并显示最后一行行号 //sed是逐行打印的,所有3p在前
[root@localhost ~]# sed '5q' aa.txt 从第5行退出,后面不做处理
使用sed命令删除
[root@localhost ~]# cat -n zz.txt | sed -n 'd' 全部删除
[root@localhost ~]# sed -n '10d' zz.txt 删除第10行
[root@localhost ~]# sed '1,3d' aa.txt 删除第1到3行
[root@localhost ~]# sed '/root/d' 删除包含root的行
[root@localhost ~]# sed '/^root/d' aa.txt 删除已root开头的行
[root@localhost ~]# sed -n '10s/ROOT/XXX/gpi' 定位到第10行忽略大小写把root替换为XXX
[root@localhost ~]# sed -n '1,10s/ROOT/XXX/gpi' 第1行和第10行
使用sed命令插入和附加文本
sed '1a hello word' aa.txt 在第一行的下面插入hello word
sed '1i hello word' aa.txt 在第一行上面插入
sed 'a IPADDR=192.168.80.1' aa.txt 每一行的下面都插
sed '/root/a IPADDR=192.168.80.1' aa.txt 有root的的行插入
sed '1,3a IPADDR=192.168.80.1' aa.txt 1—3行插入
sed -i '1,3a IPADDR=192.168.1.1' aa.txt 直接编辑文件,而不输出结果
sed -i.bak '1,3a IPADDR=192.168.1.1' aa.txt 编辑文件的时候备份文件
sed 'r /etc/hosts' aa.txt r读取一个文件
sed '1r /etc/hosts' aa.txt 第1行读过来
sed '1,3r /etc/hosts' aa.txt 1到3行
sed '/root/r /etc/hosts' aa.txt 在有root的行读取
sed 'w /opt/bak' aa.txt 写入另外一个文件/另存
sed '1w /opt/bak' aa.txt 再次写入就覆盖