目录
正则的定义:使用一些特殊符号+字母和数字按照某个正确的规则组合成一个公式来表示某个意思这就是正则表达式。
shell编程:Linux里的编程,主要就是使用linux命令+流控,实现自动化的去操作Linux系统。
shell编程的目的就是编写脚本,批量去操作Linux,完成多个任务。
grep:文本过滤
awk:截取、分类统计
sed:修改文件里面的内容。
一、sed是什么?有什么作用?
sed是一种支持正则表达式的非交互式流编辑器(stream editor),脚本修改文本或者文本替换的最佳工具。
sed -stream editor for filtering and transforming text 就是一个文本过滤和转换(替换)的流编辑器。
stream:数据流、文本流。
①替换renxiaojing文件里的luoziyao为luodayou
[root@localhost shell]# sed -i 's/luoziyao/luodayou/' renxiaojing
[root@localhost shell]# echo $?
0
[root@localhost shell]# cat renxiaojing
aomeimie luodayou
sanchuang feng laoshi
zhang tongtong xuyalan
② 替换操作:
[root@localhost shell]# sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
-n ---quiet ,---silent
cat - concatenate files and print on the standard output
concatenate:连接、拼接
③查看renxiaojing文件和etc/passwd文件里面的内容,并写入luo.txt文件里
[root@localhost shell]# cat renxiaojing.txt /etc/passwd >luo.txt
[root@localhost shell]# cat luo.txt
aomeimie luodayou
sanchuang feng laoshi
zhang tongtong xuyalan
root:x:0:0:root:/root:/bin/bash
sed -i 's/..../..../g' 其中s:表示substitute:替换; g:global
将renxiaojing文件里面所有的tongtong全部变成jingjing。
[root@localhost shell]# sed -i 's/tongtong/jingjing/g' renxiaojing.txt
[root@localhost shell]# cat renxiaojing.txt
aomeimie luodayou
sanchuang feng laoshi
zhang jingjing xuyalan
jingjing jingjing jingjing
二、sed执行的原理
sed -i 's/dayou/ziyao/g' renxiaojing.txt
原理图为:
三、sed的语法命令格式
1、格式
sed 【选项】sed编辑命令 输入文件
shell命令 | sed 【选项】sed编辑命令
sed 【选项】-f sed脚本文件 输入文件
2、sed的常用选项
-n | 只显示匹配处理的行(否则会输出所有) |
-e | 执行多个编辑命令时(一般用;代替) |
-i | 直接在文件中进行修改,而不是输出到屏幕 |
-r | 支持扩展正则表达式 |
-f | 从脚本文件中读取内容并执行(文件中的编辑命令每行一个,不用;隔开) |
3、sed的常用编辑命令
p | 打印匹配行 print |
d | 删除指定行 delete |
a | 在匹配行后面追加append |
i | 在匹配行前面插入insert |
c | 整行替换 |
r | 将文件的内容读入 read |
w | 将文本写入文件 write |
s | 字符串替换(匹配正则表达式)substitute |
= | 输出行号 |
2c表示 替换第二行,-i表示直接在文件中进行修改。
[root@localhost shell]# sed -i '2c cali sanchuang' renxiaojing.txt
[root@localhost shell]# cat renxiaojing.txt
aomeimie luoziyao
cali sanchuang
zhang jingjing xuyalan
jingjing jingjing jingjing
3.1 sed中的p命令
[root@localhost shell]# sed -n '2,3p' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
awk中$0表示整行。
sed中$p表示打印最后一行。
例题:输出第一行和最后一行。
#使用head和tail
[root@localhost shell]# head -1 passwd;tail -1 passwd
root:x:0:0:root:/root:/bin/bash
tanxue1:x:2029:2032::/home/tanxue1:/bin/bash
#使用sed方法
[root@localhost shell]# sed -n '1p;$p' passwd
root:x:0:0:root:/root:/bin/bash
tanxue1:x:2029:2032::/home/tanxue1:/bin/bash
[root@localhost shell]# sed -n '3,+3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
step:步长值:从1开始往后增加2行。
[root@localhost shell]# cat passwd -n |sed -n '1~2p'
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@localhost shell]# cat passwd -n |sed -n '2~2p'
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
3.2、sed的d命令
d---delete :删除。
删除以"#"开头或者没有什么开头和结尾的内容。
[root@localhost shell]#sed -n -r '/^#|^$/d' /etc/ssh/sshd_config
查找df -h中以“/”的那行。
[root@localhost shell]# df -h|egrep "/$"
/dev/mapper/centos-root 17G 7.0G 11G 42% /
[root@localhost shell]# df -h|sed -n '/\/$/p'
/dev/mapper/centos-root 17G 7.0G 11G 42% /
[root@localhost shell]# df -h|sed -n '/^[a-Z]/p'
devtmpfs 475M 0 475M 0% /dev
[root@localhost shell]# df -h|sed -n '/^[0-9]/p'
[root@localhost shell]# df -h|sed -n '/^[0-9]/!p'
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 7.0G 11G 42% /
devtmpfs 475M 0 475M 0% /dev
........
3.3 sed的a命令
-i:表示在 文件中进行操作,不输出到屏幕中。
2i:表示在匹配的第二行前面加入内容。
例如:在renxiaojing.txt文件的第二行插入zoupeng。
[root@localhost shell]# sed -i '2i zoupeng' renxiaojing.txt #在第二行插入zoupeng
[root@localhost shell]# cat renxiaojing.txt
aomeimie luoziyao
zoupeng
cali sanchuang
tanxue
zhang jingjing xuyalan
jingjing jingjing jingjing
[root@localhost shell]# sed -i '/tanxue/i wangshuai' renxiaojing.txt #在tianxue前面插入wangshuai
[root@localhost shell]# cat renxiaojing.txt
aomeimie luoziyao
zoupeng
cali sanchuang
wangshuai
tanxue
zhang jingjing xuyalan
jingjing jingjing jingjing
a:表示追加操作,在匹配的行后面进行追加。
例如:在renxiaojing.txt文件的第二行追加tanxue。
[root@localhost shell]# sed -i '2a tanxue' renxiaojing.txt #在第二行追加tanxue
[root@localhost shell]# cat renxiaojing.txt
aomeimie luoziyao
zoupeng
tanxue
cali sanchuang
wangshuai
tanxue
zhang jingjing xuyalan
jingjing jingjing jingjing
修改Linux系统里的主机名:
将/etc/hostname文件里的名字修改为:dengjianguo
sed -i '1c dengjianguo' hostname
修改主机名:
hostnamectl set-hostname sc #将主机名改为sc。
^:表示行号
$:表示行尾
3.4 sed的s命令
默认替换第一个。
[root@localhost shell]# cat renxiaojing.txt
aomeimie luoziyao
zoupeng
cali sanchuang
wangshuai
tanxue
zhang jingjing xuyalan
jingjing jingjing jingjing
[root@localhost shell]# sed -i '/^zhang/ s/jingjing/pengpeng/' renxiaojing.txt #默认替换第一个
aomeimie luoziyao
zoupeng
tanxue
cali sanchuang
wangshuai
tanxue
zhang pengpeng xuyalan
jingjing jingjing jingjing
[root@localhost shell]# sed -i '/^zhang/ s/jingjing/pengpeng/3' renxiaojing.txt #指定替换
[root@localhost shell]# cat renxiaojing.txt
aomeimie luoziyao
zoupeng
tanxue
cali sanchuang
wangshuai
tanxue
zhang pengpeng jingjing jingjing pengpeng xuyalan
jingjing jingjing jingjing
root@localhost shell]# sed -i '/^zhang/ s/jingjing/pengpeng/g' renxiaojing.txt #全部替换
[root@localhost shell]# cat renxiaojing.txt
aomeimie luoziyao
zoupeng
tanxue
cali sanchuang
wangshuai
tanxue
zhang pengpeng pengpeng pengpeng pengpeng xuyalan
[root@localhost shell]# sed -i 's/:/\n/g' passwd
[root@localhost shell]# sed -i 's/^/sanchuang/' hosts
[root@localhost shell]# cat hosts
sanchuang127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain6
sanchuang::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
n | 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条命令而非第一条命令 |
N | 读取下一行,追加到模式空间行后面,此时模式空间有两行。 |
h | 把模式空间里的行拷贝到暂存空间。 |
H | 把模式空间里的行追加到暂存空间。 |
g | 把暂存空间的内容替换模式空间的行。 |
G | 把暂存空间的内容追加到模式空间的行后。 |
x | 把暂存空间的内容于模式空间里的当前行互换。 |
! | 对所选行以外的所有行应用命令。---》对行号进行取反。 |
2!G | 不是第二行的时候进行G操作。 |
$!d | 不是最后一行的时候进行d操作,是最后一行的时候就不进行d操作。 |
行号是sed读取的文件里的第几行。
n N:Read/append the next line of input the pattern space.
NN是将两个都加入到模式空间。
[root@localhost shell]# sed -i 'N;N;s/\n/:80,/g;s/$/:80/' test.txt
[root@localhost shell]# cat test.txt
0.0.0.0:80,1.1.1.1:80,2.2.2.2
xargs:将多行变成单行。将前面的标准输出通过管道进行标准输入得到的内容分割成一个一个的参数,使用空格隔开。
[root@localhost shell]# cat test.txt.bak|xargs
0.0.0.0 1.1.1.1 2.2.2.2
[root@localhost shell]# cat test.txt.bak|xargs|awk '{print $1":80,"$2":80,",$3":80"}'
0.0.0.0:80,1.1.1.1:80, 2.2.2.2:80
3.5 sed命令中的&
&表示替换命令中的匹配模式,代表匹配到的内容,然后可以引用。
[root@localhost shell]# echo "i have a fat cat"
i have a fat cat
[root@localhost shell]# echo "i have a fat cat"|sed 's/.at/".at"/g'
i have a ".at" ".at"
[root@localhost shell]# echo "i have a fat cat"|sed 's/.at/"&"/g'
i have a "fat" "cat"
[root@localhost shell]# cat renxiaojing.txt
........
tanxue
zhang shuaishuai 123
zhang 456 pengpeng pengpeng pengpeng pengpeng xuyalan
jingjing jingjing jingjing
[root@localhost shell]# sed -i -r 's/\<[0-9]{3}\>/&0/g' renxiaojing.txt
[root@localhost shell]# cat renxiaojing.txt
.....
tanxue
zhang shuaishuai 1230
zhang 4560 pengpeng pengpeng pengpeng pengpeng xuyalan
jingjing jingjing jingjing
3.6 sed -r:正则中的转义
[root@localhost shell]# sed -n -r 's/[A-Z]/&2022/gp' test1.txt
abcH2022H2022H2022H2022dddde
abF2022K2022D2022dddde
isO2022O2022O2022ishabxil
H2022E2022P2022R2022E2022doodcm
\ \:转义字符
[root@localhost shell]# sed -n '/13\/Jul\/2022:16:53:58/,/13\/Jul\/2022:16:56:21/p' access.log
sed -n
localhost shell]# sed -n '#13/Jul\/2022:16:53:58#,#13/Jul/2022:16:56:21#p' access.log
修改时间:date -s "修改的时间"。
3.7 sed的查找
①根据行号
②根据模式 ---正则
-r:扩展正则
p:表示打印
③以‘#’开头或者没有什么开头和结尾的内容,并打印出来。
[root@localhost shell]#sed -n -r '/^#|^$/p' /etc/ssh/sshd_config
④ 不打印以‘#’开头或者没有什么开头和结尾的内容。
[root@localhost shell]#sed -n -r '/^#|^$/!p' /etc/ssh/sshd_config
3.8 shell里的变量传递给sed
sed -传参问题-使用变量,然后应用引用变量接{}:花括号。
[root@localhost shell]# a=5
[root@localhost shell]# b=10
[root@localhost shell]# sed -n '$ap;$bp' /etc/passwd
p;$bp
[root@localhost shell]# sed -n "${a}p;${b}p" /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost shell]# echo $a
5
[root@localhost shell]# echo $b
10
[root@localhost shell]# sg="wangzixiang"
[root@localhost shell]# echo $sg
wangzixiang
[root@localhost shell]# echo ${sg}1
wangzixiang1
[root@localhost shell]# useradd wangzixiang
[root@localhost shell]# sg=wangzixiang
[root@localhost shell]# sed -n "/${sg}/p" /etc/passwd
wangzixiang:x:2030:2033::/home/wangzixiang:/bin/bash
3.9 sed中标签的用法
sed中使用圆括号定义替换模式中的部分字符。
标签可以方便在后面引用,每行指令最多使用9个标签。
小圆括号里面匹配的就是一个标签,后面再替换的时候可以引用,第一个小圆括号里的是\1,以此类推。
[root@localhost shell]# echo aaa bbb ccc |sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/'
ccc bbb aaa
[root@localhost shell]# echo aaa bbb ccc |sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3/'
ccc
[root@localhost shell]# echo aaa bbb ccc |awk '{print $3,$2,$1}'
ccc bbb aaa
方法一:
[root@localhost shell]# tac test.txt.bak
2.2.2.2
1.1.1.1
0.0.0.0
方法二:
[root@localhost shell]# cat test.txt.bak|xargs|awk '{print $3"\n"$2"\n"$1}'
2.2.2.2
1.1.1.1
0.0.0.0