01.知识概述部分
1)三剑客sed命令概述介绍
2)三剑客sed命令执行原理 命令基本语法
3)三剑客sed命令实操练习 增 删 改 查
02.知识回顾说明
1)基础正则符号:7个 ^ $ . * \ [ ] [^ ]
2)扩展正则符号:5个 + ? | { } ()
grep +E 或者egrep
sed +r
识别扩展正则 + 不识别时用egrep “+”
3)总结grep命令参数
grep -i ------忽略大小写搜索信息
grep -n ------搜索信息后显示行号
grep -c ------统计筛选出来的行数
grep -v ------将搜索信息进行取反
grep -o ------只输出显示匹配信息
grep -w ------按照字符串进行匹配
grep -A ------过滤指定内容之后的信息
grep -B ------过滤指定内容之前的信息
grep -C ------过滤指定内容上下几行的信息
grep -E ------识别扩展正则信息
grep -r ------递归搜索指定的信息 示例:grep -r "oldboy" ./
03.三剑客命令sed概述介绍
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed - stream editor for filtering and transforming text
用于过滤和转换文本的流编辑器
1)可以查找过滤筛选出指定的信息
2)可以编辑文件内容信息
3)擅长对文件行进行操作
4)编写脚本:系统基础优化脚本
sh 优化脚本
04.三剑客sed命令执行原理
执行原理过程:将按照文件每行信息进行处理,找出符合条件信息,执行相应操作
命令语法结构:sed 【参数】 ‘条件 指令(处理动作)’ 文件信息
如何定义条件:根据行号 根据内容 根据正则信息
如何定义指令:满足条件的信息处理动作(添加 删除 修改 输出)
常用参数:
a\ 在当前行下面插入文本。
i\ 在当前行上面插入文本。
c\ 把选定的行改为新的文本。
d 删除,删除选择的行。
D 删除模板块的第一行。
s 替换指定字符
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l 列表不能打印字符的清单。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p 打印模板块的行。
P(大写) 打印模板块的第一行。
q 退出Sed。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file 从file中读行。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file 写并追加模板块到file末尾。
W file 写并追加模板块的第一行到file末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。
sed替换标记
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记
sed元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
05.三剑客sed命令实操练习
准备练习文件:
cat >>person.txt<<EOF
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF
1)熟悉sed命令查询操作(输出操作)
根据行号进行筛选
[root@jason oldboy]# awk '{print NR,$0}' awk_test.txt awk显示所有行号
[root@jason oldboy]# grep -n "xxx" awk_test.txt grep显示文件行号
[root@jason oldboy 10:19:56]# cat -n person.txt cat显示行号
[root@jason oldboy 10:20:40]# sed "=" person.txt |xargs -n2 sed显示行号
· 单行信息: sed ‘3p’ 文件信息 p:输出信息 -n不显示默认输出
[root@jason oldboy 10:04:27]# sed -n '3p' person.txt
103,Alex,COO
· 多行信息: sed -n ‘2,4p’ 文件信息
[root@jason oldboy 10:04:31]# sed -n '2,4p' person.txt
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
· 连续多行信息:sed -n ‘2,$p’ 文件信息
[root@jason oldboy 10:13:04]# sed -n '1,$p' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
· 不连续多行 : sed -n ‘2p;4p’ person.txt
[root@jason oldboy 10:07:19]# sed -n '2p;4p' person.txt
102,zhaoyao,CTO
104,yy,CFO
[root@jason oldboy 17:45:33]# sed -n '1p;3p;5p' person.txt
101,oldboy,CEO
103,Alex,COO
105,feixue,CIO
根据字符进行筛选
· 单行信息:sed -n ‘/oldboy/p’ person.txt
[root@jason oldboy 10:32:36]# sed -n '/oldboy/p' person.txt
101,oldboy,CEO
· 多行信息
连续多行信息输出:
[root@jason oldboy 10:36:53]# sed -n '/oldboy/,/Alex/p' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
(会一直查找oldboy下面到Alex的内容)!!!
[root@jason oldboy 10:39:48]# sed -n '/oldboy/,/Alex/p' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE
不连续多行信息输出:
[root@jason oldboy 10:40:03]# sed -n '/oldboy/p;/Alex/p' person.txt
101,oldboy,CEO
103,Alex,COO
106,oldboy,COO
2)熟悉sed命令删除操作
sed -i '6d' person.txt ------真正删除文件信息
-i ------将模式空间隐藏操作影响到磁盘中
将模式空间信息 —> 覆盖 —> 磁盘文件中
sed -i.bak '/COO/d' person.txt ---将源文件内容先进行备份,再进行操作
-i放在最后,-i后面的字符就是备份文件的扩展名
-i与-n不要一起使用!!!
根据行号进行删除
· 单行删除
[root@jason oldboy 10:40:06]# sed '3d' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
104,yy,CFO
105,feixue,CIO
· 多行删除
连续多行
[root@jason oldboy 10:46:52]# sed '3,5d' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE
不连续多行
[root@jason oldboy 10:49:23]# sed '3d;5d' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
104,yy,CFO
106,oldboy,COO
107,oldgirl,CPP
根据字符进行删除
[root@jason oldboy 10:53:07]# cat person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE
· 单行信息
[root@jason oldboy 19:24:56]# sed '/yy/d' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
105,feixue,CIO
· 多行信息
连续多行信息删除
[root@jason oldboy 19:22:50]# sed '/yy/,/oldboy/d' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
107,oldgirl,CPP
108,olddog,CEE
不连续多行信息删除
[root@jason oldboy 19:27:00]# sed '/yy/d;/oldboy/d' person.txt
102,zhaoyao,CTO
103,Alex,COO
105,feixue,CIO
107,oldgirl,CPP
108,olddog,CEE
坑:删除一个文件有#号的行
1)查询出需要删除的内容
sed -n '/^#/p' config
2) 删除文件信息 这个-n要记得删除
sed -i '/^#/p' config
PS:
- -i参数后面不能再跟上其他参数
- -i参数和-n参数尽量不要结合使用
-i : 真正修改文件内容
3)熟悉sed命令添加操作
根据行号添加信息
3a:在第三行的后面添加相应信息
3i :在第三行的上面添加相应信息
· 单行添加
[root@jason oldboy 11:18:51]# sed '1aoldboy69' person.txt
101,oldboy,CEO
oldboy69
102,zhaoyao,CTO
103,Alex,COO
· 多行添加
连续多行:
[root@jason oldboy 11:29:09]# sed '1,3aoldboy69' person.txt
101,oldboy,CEO
oldboy69
102,zhaoyao,CTO
oldboy69
103,Alex,COO
oldboy69
104,yy,CFO
不连续多行
[root@jason oldboy 11:30:12]# sed -e '1aoldboy69' -e '3aoldboy69' -e '5aoldboy69' person.txt
101,oldboy,CEO
oldboy69
102,zhaoyao,CTO
103,Alex,COO
oldboy69
104,yy,CFO
105,feixue,CIO
oldboy69
106,oldboy,COO
补充:在指定行后面添加多行信息 利用换行符\n
[root@jason oldboy 11:30:49]# sed '1aoldboy69\noldboy70' person.txt
101,oldboy,CEO
oldboy69
oldboy70
102,zhaoyao,CTO
103,Alex,COO
根据字符进行添加???????????????
sed '/^test/i\this is a test line' file
· 单行添加
[root@jason oldboy 20:45:22]# sed 's/yy/&ABC/' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yyABC,CFO
105,feixue,CIO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE
[root@jason oldboy 20:46:39]# sed 's/yy/ABC&/' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,ABCyy,CFO
105,feixue,CIO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE
· 多行添加
连续多行
不连续多行
企业常见配置文件添加信息方法:
[root@jason oldboy 11:19:54]# sed '$aoldboy69' person.txt -----> $表示最后一行; 在最后一行后面附加新的信息
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE
oldboy69
在每一行后面追加字符串 ABC,使得新文件为
[root@jason oldboy 20:31:57]# sed 's/$/ ABC/' person.txt
101,oldboy,CEO ABC
102,zhaoyao,CTO ABC
103,Alex,COO ABC
104,yy,CFO ABC
105,feixue,CIO ABC
106,oldboy,COO ABC
107,oldgirl,CPP ABC
108,olddog,CEE ABC
在指定字符后面添加
[root@jason oldboy 20:45:05]# sed 's#yy# &ABC#' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104, yyABC,CFO
105,feixue,CIO
awk 统计分析 正则符号(基础 扩展) \n \t
sed 编辑 正则符号(基础) \n \t -r
grep 筛选 正则符号(基础) -E egrep
常用基础命令 最低级别 正则符号 \n \t
4)熟悉sed命令修改操作 *****
根据行号替换信息
· 根据单行进行替换
[root@jason oldboy 23:40:04]# sed '1s#oldboy#123456#g' person.txt
101,123456,CEO ------ 将oldboy信息替换为123456
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
在指定字符前面或后面替换 $
[root@jason oldboy 20:02:49]# sed '/yy/{s#$#12345#g}' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO12345
利用正则将信息匹配出来,再做替换
· 根据多行进行替换
[root@jason oldboy 23:41:28]# sed '2,4s#[0-9]\+#abc#g' person.txt
101,oldboy,CEO
abc,zhaoyao,CTO
abc,Alex,COO
abc,yy,CFO
利用后项引用前项做替换:
练习:网卡地址进行变更
[root@jason oldboy 00:13:37]# sed -r '/IPADDR/s#(.*=).*#\110.0.0.201#g' /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=56adcb14-5024-4844-b4a3-7768d5ea8bfb
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.201
PREFIX=24
GATEWAY=10.0.0.254
IPV6_PRIVACY=no
DNS1=223.5.5.5
练习:批量创建用户信息 oldboygirl01 … oldgirl10 不能使用for循环 bash命令
思路一:拼凑出来10个创建用户命令
useradd oldgirl01
useradd oldgirl02
useradd oldgirl03
useradd oldgirl04
useradd oldgirl05
useradd oldgirl06
useradd oldgirl07
useradd oldgirl08
useradd oldgirl09
useradd oldgirl10
seq -w 10|sed -r 's#(.*)#useradd olddog\1#g'|bash
seq -w 10|sed -r 's#(.*)#useradd olddog\1#g'
思路二:
批量创建用户,生成随机密码
第一个历程: 拼凑出创建用户并设置密码命令
seq -w 10|sed -r 's#(.*)#useradd olddog\1;echo 密码信息|passwd --stdin olddog\1#g'
useradd olddog01;echo 密码信息|passwd --stdin olddog01
useradd olddog02;echo 密码信息|passwd --stdin olddog02
useradd olddog03;echo 密码信息|passwd --stdin olddog03
useradd olddog04;echo 密码信息|passwd --stdin olddog04
useradd olddog05;echo 密码信息|passwd --stdin olddog05
useradd olddog06;echo 密码信息|passwd --stdin olddog06
useradd olddog07;echo 密码信息|passwd --stdin olddog07
useradd olddog08;echo 密码信息|passwd --stdin olddog08
useradd olddog09;echo 密码信息|passwd --stdin olddog09
useradd olddog10;echo 密码信息|passwd --stdin olddog10
第二个历程: 生成随机密码信息
seq -w 10|sed -r 's#(.*)#useradd olddog\1;echo $(tr -cd 'a-zA-Z0-9' </dev/urandom|head -c 6)|passwd --stdin olddog\1#g'
useradd olddog01;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog01
useradd olddog02;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog02
useradd olddog03;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog03
useradd olddog04;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog04
useradd olddog05;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog05
useradd olddog06;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog06
useradd olddog07;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog07
useradd olddog08;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog08
useradd olddog09;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog09
useradd olddog10;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog10
第三个历程: 将用户和密码对应关系信息, 进行保存
seq -w 10|sed -r 's#(.*)#useradd olddog\1;passwd=$(tr -cd 'a-zA-Z0-9' </dev/urandom|head -c 6);echo $passwd|passwd --stdin olddog\1; echo olddog\1 $passwd >>/tmp/user_passwd#g'|bash
练习:实现批量修改文件名称
思路一:找出要修改的文件
[root@jason oldboy 00:54:23]# ls
567.txt 777.txt oldboy01.txt oldboy02.txt oldboy03.txt person.txt
666.txt oldboy01 oldboy02 oldboy03 passwd test01.txt
[root@jason oldboy 00:54:41]# find /oldboy -maxdepth 1 -type f -name "[0-9]*.txt"
/oldboy/567.txt
/oldboy/666.txt
/oldboy/777.txt
思路二:如何修改,命令mv
[root@jason oldboy 00:58:53]# mv 567.txt 567.jpg
[root@jason oldboy 00:59:09]# ls
567.jpg 777.jpg oldboy01.txt oldboy02.txt oldboy03.txt person.txt
思路三:整合命令并使用bash执行
[root@jason oldboy 00:56:39]# find /oldboy -maxdepth 1 -type f -name "[0-9]*.txt"|sed -r 's#(.*)txt#mv \1txt \1jpg#g'|bash
[root@jason oldboy 00:56:46]# ls
567.jpg 777.jpg oldboy01.txt oldboy02.txt oldboy03.txt person.txt
666.jpg oldboy01 oldboy02 oldboy03 passwd test01.txt
练习:利用sed命令取出ip地址
思路一: 取出有IP地址行的信息
ip a s eth0|sed -n '3p'
思路二: 取出IP地址(将前面减掉/将后面减掉)
[root@oldboy69 oldboy 12:32:25]# ip a s eth0|sed -n '3p'|sed -r 's#.*inet (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g'
10.0.0.200
sed -r 's#.*inet (.*)#\1#g'
sed -r 's#(.*)/24.*#\1#g'
sed -r 's#.*inet (.*)/24.*#\1#g'
ip a s eth0|sed -n '3p'|sed -r 's#.*inet (.*)/24.*#\1#g'
10.0.0.200
sed -n '3 p' (3p可以分开)
sed -r 's#.*inet (.*)/24.*#\1#g'
sed -nr '3s#.*inet (.*)/24.*#\1#gp' (最终答案)
# ip a s eth0|sed -nr '3s#.*inet (.*)/24.*#\1#gp'
10.0.0.200
06.sed命令使用忠告
1)sed命令操作时候要做备份
sed -i.bak ------在编辑文件时,直接对文件进行备份
# sed -rir '2s#(oldboy)#\169#g' person.txt
[root@oldboy69 oldboy 12:52:22]# ll person.txt*
-rw-r--r--. 1 root root 96 Dec 19 12:52 person.txt
-rw-r--r--. 1 root root 107 Dec 19 12:46 person.txt.bak
-rw-r--r--. 1 root root 94 Dec 19 12:52 person.txtr
说明: sed命令在是使用时, 需要用到多个参数, 要将-i参数写在所有参数后面
2)sed命令在使用时, 一定不要让-n参数和-i参数一起使用
sed命令课程总结:
1)sed命令作用说明
a 过滤筛选文件内容信息
b 擅长对指定行进行操作
c 擅长直接编辑文件内容
2)sed命令执行原理
3)sed命令语法格式 sed 参数 ‘条件 指令’ 文件信息
参数:
-n ------取消默认输出
-i ------真正编辑文件内容
-r ------识别扩展正则
-e ------识别多个条件操作
指令:
p ------输出信息
d ------删除操作
a ------向下附加操作
i ------向上插入操作
s ------替换操作
g ------全局替换
4)sed命令实践用法
a 如何进行查询操作 根据行/字符
b 如何进行删除操作 根据行/字符
c 如何进行添加操作 根据行/字符
d 如何进行替换操作 根据行/字符 后项引用前项() \1