01. 课程介绍部分
- 系统正则符号
- 系统sed命令
02. 课程知识回顾(提问环节)
- 通配符号 * {}
通配符号主要用于匹配文件名称 - 正则符号
正则符号主要用于匹配文件内容
基础正则: ^$ ^$ .任意1个且只有一个 * 1/0次以上.*所有包括空行 [ ] 匹配括号中的每一个[^]取反 \ 转义符号
扩展正则: + 1/多次|多个条件 {n,m} {,m} {n,} {n} ()匹配一个整体 ?0/1次
取出IP地址:
第一步:有什么命令可以显示IP地址:[root@oldboy63 ~]#ip a s eth0
第二步: 筛选出指定行grep "eth0$"
第三步:取出IP地址
[root@oldboy63 ~]#ip a s eth0|grep "eth0\$"|egrep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@oldboy63 ~]#ip a s eth0|grep "eth0$"|egrep "([0-9]{1,3}\.?){4}" -o
10.0.0.200
10.0.0.255
[root@oldboy63 ~]#ip a s eth0|grep "eth0\$"|egrep "([0-9]{1,3}\.?){4}" -o|head -1
10.0.0.200
\ 可以将扩展正则转换为普通正则
[root@oldboy63 ~]#echo "10000 oldboy"|egrep "[0-9]+"
10000 oldboy
[root@oldboy63 ~]#echo "10000 oldboy"|grep "[0-9]\+"
10000 oldboy
grep使用正则符号过滤数字号码信息
[root@oldboy66 oldboy]# cat test.txt
张三:198404808500000
李四:288288989991232
王无:942837599895898598
小小:12349890
[root@oldboy66 oldboy]# grep -vwE "[0-9]{15}" test.txt
王无:942837599895898598
小小:12349890
[root@oldboy66 oldboy]# grep -wE "[0-9]{15}" test.txt
张三:198404808500000
李四:288288989991232
03 系统三剑客命令 sed
sed作用: 修改文件内容 对文件行进行操作
sed命令主要在企业中处理:配置文件 文本文件 数据信息
sed命令语法结构:
sed[参数] ‘条件 指令 ’ 文件信息
[root@oldboy66 oldboy]# sed -n '/disable/p' /etc/selinux/config
\# disabled - No SELinux policy is loaded.
SELINUX=disabled
sed命令执行原理:
04 sed操作方式
增:在文件中添加信息
删:将文件中指定信息删除
改:修改替换文件内容
查:查找相应内容信息
查看文件信息与grep类似
第一方式:指定行查找:
[root@oldboy63 ~]#sed -n '3p' person.txt
103,Alex.COD
[root@oldboy63 ~]#sed -n '2,4p' person.txt ---多行连续过滤
102,zhang,CTO
103,Alex.COD
104,Heqing,CIO
[root@oldboy63 ~]#sed -n '2p;4p' person.txt ----过滤不连续多行信息
102,zhang,CTO
104,Heqing,CIO
第二种:按指定内容过滤
[root@oldboy63 ~]#sed -n '/Alex/p' person.txt --- 过滤指定信息的行
103,Alex.COD
[root@oldboy63 ~]#sed -n '/CTO/,/CIO/p' person.txt --- 按照信息过滤连续行
102,zhang,CTO
103,Alex.COD
104,Heqing,CIO
[root@oldboy63 ~]#sed -nr '/oldboy|Heqing/p' person.txt
101,oldboy,CEO
104,Heqing,CIO
[root@oldboy63 ~]#sed -n '/oldboy\|Heqing/p' person.txt
101,oldboy,CEO
104,Heqing,CIO
[root@oldboy63 ~]#sed -n '/oldboy/p;/Heqing/p' person.txt
101,oldboy,CEO
104,Heqing,CIO
增加文件信息
方式一: 在指定行后面添加信息
[root@oldboy63 ~]#sed '2aoldboy' person.txt ---2a在第二行后面添加信息
101,oldboy,CEO
102,zhang,CTO
oldboy
103,Alex.COD
104,Heqing,CIO
105,Feixue.CIO
[root@oldboy63 ~]#sed '$aoldboy' person.txt ---$a在最后一行添加内容
101,oldboy,CEO
102,zhang,CTO
103,Alex.COD
104,Heqing,CIO
105,Feixue.CIO
oldboy
多行添加信息 -- 连续的多行
[root@oldboy63 ~]#sed -e '2aboy' -e '4aboy' person.txt ---使用参数-e 添加多行内容
101,oldboy,CEO
102,zhang,CTO
boy
103,Alex.COD
104,Heqing,CIO
boy
105,Feixue.CIO
直接换行添加多行内容:
[root@oldboy63 ~]#sed '2aoldb\noldgirl\nbaby' person.txt
101,oldboy,CEO
102,zhang,CTO
oldb
oldgirl
baby
103,Alex.COD
104,Heqing,CIO
105,Feixue.CIO
删除指定信息
按行删除指定信息:
[root@oldboy63 ~]#sed '4d' person.txt
101,oldboy,CEO
102,zhang,CTO
103,Alex.COD
105,Feixue.CIO
[root@oldboy63 ~]#sed -r '/Alex|oldboy/d' person.txt
删除/etc/service文件中注释和空行
方法一:
[root@oldboy63 ~]sed -r '/^$|^#/d' /etc/services
方法二:
[root@oldboy63 ~]sed -rn '/^$|^#/!p' /etc/services
替换操作:
替换IP 地址:
[root@oldboy63 ~]#sed -r '/IPADDR/s#(IP.*=)10.0.0.200#\110.0.0.201#g' /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=10.0.0.201
PREFIX=24
&:利用 & 可以实现后项引用前项正则匹配到的信息
[root@oldboy66 oldboy]# echo "123456"|sed 's#[0-9]+#<&>#g'
123456
[root@oldboy66 oldboy]# echo "123456"|sed 's#[0-9]\+#<&>#g'
<123456>
[root@oldboy66 oldboy]# echo "123456"|sed -r 's#[0-9]{1}#<&>#g'
<1><2><3><4><5><6>
利用sed获取IP地址:
第一步:选出有IP地址的行
[root@oldboy66 oldboy]# ip a s eth0|sed -n '3p'
inet 10.0.0.201/24 brd 10.0.0.255 scope global eth0
第二步:去掉头尾,选出IP地址
[root@oldboy66 oldboy]# ip a s eth0|sed -n '3p'|sed -r 's#^.*t (.*)#\1#g'
10.0.0.201/24 brd 10.0.0.255 scope global eth0
[root@oldboy66 oldboy]# ip a s eth0|sed -n '3p'|sed -r 's#^.*t (.*)#\1#g'|sed -r 's#(.*)/24.*$#\1#g'
10.0.0.201
第三步:合并同类项,减缩命令
[root@oldboy66 oldboy]# ip a s eth0|sed -n '3p'|sed -r 's#^.*t (.*)/24.*$#\1#g'
10.0.0.201
[root@oldboy66 oldboy]# ip a s eth0|sed -nr '3s#^.*t (.*)/24.*$#\1#gp'
10.0.0.201
利用sed命令获取文件属性权限数值:
[root@oldboy66 ~]# stat /etc/hosts|sed -n '4p'
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
[root@oldboy66 ~]# stat /etc/hosts|sed -n '4p'|sed -r 's#^A.*((.*)/.*$#\1#g'
sed: -e expression #1, char 20: Unmatched ( or \(
[root@oldboy66 ~]# stat /etc/hosts|sed -n '4p'|sed -r 's#^A.*\((.*)/-.*$#\1#g' (sed有贪婪,需加 – 匹配到此为止)
0644
实际修改文件内容:
常见错误:1 sed命令参数 -n 和 -r 不能同时使用,以免出现错误
[root@oldboy63 ~]#cat person.txt
101,oldboy,CEO
102,zhang,CTO
103,Alex.COD
104,Heqing,CIO
105,Feixue.CIO
[root@oldboy63 ~]#sed -n '/oldboy/p' person.txt
101,oldboy,CEO
[root@oldboy63 ~]#sed -n '/oldboy/s#oldboy#oldgirl#gp' person.txt
101,oldgirl,CEO
[root@oldboy63 ~]#sed -ni '/oldboy/s#oldboy#oldgirl#gp' person.txt
[root@oldboy63 ~]#cat person.txt
101,oldgirl,CEO
常见错误2: 使用sed命令-i 参数一定放在所有参数最后面
[root@oldboy63 ~]#sed -ni.bak '/oldboy/s#oldboy#oldgirl#gp' person.txt---.bak快速备份文件后缀名
[root@oldboy63 ~]#cat person.txt
101,oldgirl,CEO
[root@oldboy63 ~]#cat person.txt.bak
101,oldgirl,CEO
101,oldboy,CEO
102,zhang,CTO
103,Alex.COD
104,Heqing,CIO
105,Feixue.CIO
[root@oldboy63 ~]#mv person.txt{.bak,}---快速还原文件内容
mv: overwrite ‘person.txt’? y
[root@oldboy63 ~]#[root@oldboy63 ~]#cat person.txt
101,oldgirl,CEO
101,oldboy,CEO
[root@oldboy63 ~]#sed -in '/oldboy/s#oldboy#oldgirl#gp' person.txt
[root@oldboy63 ~]#cat person.txt
101,oldgirl,CEO
101,oldgirl,CEO
101,oldgirl,CEO
[root@oldboy63 ~]#ll person.txt
person.txt person.txtn ----n未当参数,只是相当后缀名了
sed命令整行替换文件内容:
[root@oldboy63 ~]#cat person.txt
101,oldgirl,CEO
101,oldgirl,CEO
101,oldgirl,CEO
102,zhang,CTO
[root@oldboy63 ~]#sed -i '3coldboy' person.txt ---3c第三行整体做替换
[root@oldboy63 ~]#cat person.txt
101,oldgirl,CEO
101,oldgirl,CEO
oldboy
102,zhang,CTO
sed命令实现文件批量重命名:
[root@oldboy63 oldboy]# ls|sed -r 's#(.*)\.txt#\1#g'
oldboy1
oldboy2
oldboy3
oldboy4
oldboy5
oldboy6
oldboy7
oldboy8
oldboy9
[root@oldboy63 oldboy]# ls|sed 's#(.*)\.txt#mv &.txt \1.jpg#g'
sed: -e expression #1, char 29: invalid reference \1 on `s' command's RHS
[root@oldboy63 oldboy]# ls|sed -r 's#(.*)\.txt#mv &.txt \1.jpg#g'
mv oldboy1.txt.txt oldboy1.jpg
mv oldboy2.txt.txt oldboy2.jpg
mv oldboy3.txt.txt oldboy3.jpg
mv oldboy4.txt.txt oldboy4.jpg
mv oldboy5.txt.txt oldboy5.jpg
mv oldboy6.txt.txt oldboy6.jpg
mv oldboy7.txt.txt oldboy7.jpg
mv oldboy8.txt.txt oldboy8.jpg
mv oldboy9.txt.txt oldboy9.jpg
[root@oldboy63 oldboy]# ls|sed -r 's#(.*)\.txt#mv & \1.jpg#g'
mv oldboy1.txt oldboy1.jpg
mv oldboy2.txt oldboy2.jpg
mv oldboy3.txt oldboy3.jpg
mv oldboy4.txt oldboy4.jpg
mv oldboy5.txt oldboy5.jpg
mv oldboy6.txt oldboy6.jpg
mv oldboy7.txt oldboy7.jpg
mv oldboy8.txt oldboy8.jpg
mv oldboy9.txt oldboy9.jpg
[root@oldboy63 oldboy]# ls|sed -r 's#(.*)\.txt#mv & \1.jpg#g'|bash
[root@oldboy63 oldboy]#ll
total 0
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy1.jpg
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy2.jpg
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy3.jpg
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy4.jpg
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy5.jpg
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy6.jpg
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy7.jpg
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy8.jpg
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy9.jpg
专业批量修改重命名:rename
语法: rename ‘名称中要修改的信息’ ‘修改成什么’ 文件信息
[root@oldboy63 oldboy]#rename '.jpg' '.txt' oldboy*
[root@oldboy63 oldboy]#ll
total 0
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy1.txt
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy2.txt
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy3.txt
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy4.txt
-rw-r--r-- 1 root root 0 Jul 28 17:33 oldboy5.txt
取IP地址专业命令:
[root@oldboy63 ~]#hostname -I
10.0.0.200