Day18操作系统 三剑客sed命令

01. 课程介绍部分

  1. 系统正则符号
  2. 系统sed命令

02. 课程知识回顾(提问环节)

  1. 通配符号 * {}
    通配符号主要用于匹配文件名称
  2. 正则符号
    正则符号主要用于匹配文件内容
    基础正则: ^$ ^$ .任意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命令执行原理:


QQ图片20190727160721.png

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

你可能感兴趣的:(Day18操作系统 三剑客sed命令)