sed命令使用详解

环境:centos7

使用sed-格式

命令行格式

    sed [options] 'command' file(s)

    option: -e;-n

    command: 行定位 (正则)+sed命令(操作)

格式行格式举例

    sed -n '/root/p'

    sed -e '10,20p' -e 's/false/true/g'

基本操作命令

    -p (打印相关的行)记住要和参数-n 配合

    sed -n 'p' passwd

    sed ---行定位

定位一行: x;行号  /pattern/ 正则

    sed -n '10p' passwd

    sed -n '/root/p' passwd

定位几行:

    x,y; x行到y

    /pattern/,x;  x y都可以用正则来表示

     x,y! ;表示不取xy的行即取反

    nl passwd |sed -n '10,20p'  #nl开启行号

    nl passwd |sed -n '/operator/,/libstoragemgmt/p'  # 打印从operator开始到libstoragemgmt结尾的行

    nl passwd |sed -n '5,10!p'   #打印510行以外的其他行

    nl passwd |sed -n '10!p'   #打印10行以外的其他行

定位间隔几行:firs~step

     nl passwd |sed -n '2~3p'  #表示第二行开始中间每间隔3行输出 (25812 的行)

sed---操作命令

 基本操作命令(2

    -a (新增行) / i (插入行)

    -c (替代行)

    -d (删除行)

    nl passwd |sed '2a ======' #在第2行后面添加=====的一行内容

[root@tmp]#  nl passwd |sed '2a ======'
     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

    nl passwd |sed '2,5a ======' #在第2行到5行每行后面添加=====的一行内容

[root@tmp]# nl passwd |sed '2,5a ======'
     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  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
======

     nl passwd |sed '2i ======' #在第5行前面插入=====的一行内容

[root@tmp]#  nl passwd |sed '2i ======'
     1  root:x:0:0:root:/root:/bin/bash
======
     2  bin:x:1:1:bin:/bin:/sbin/nologin

     nl passwd |sed '2c ======' #将第二行替换成=====的一行内容

[root@tmp]# nl passwd |sed '2c ======'
     1  root:x:0:0:root:/root:/bin/bash
======
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin

  nl passwd |sed '1,2c ======' #将多行替换成=====的一行内容

[root@ tmp]# nl passwd |sed '1,2c ======'
======
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin

       nl passwd |sed '1,2d' #删除12

        nl passwd |sed '/root/d'  #删除带root的行

[root@tmp]#  nl passwd |sed '/root/d'
     2  bin:x:1:1:bin:/bin:/sbin/nologin
[root@tmp]#   nl passwd |sed '1,2d'
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin

系统优化

        sed '$a port 10022 allowrootlogin no'  sshd_config.conf    #表示在文件末尾添加两行

         $表示文件末尾   表示换行

[root@tmp]# sed '1i port 10022 
allowrootlogin no'  passwd #第一行前添加两行
port 10022
allowrootlogin no
root:x:0:0:root:/root:/bin/bash

        sed '$a      port 10022    allowrootlogin no'  sshd_config.conf  #美化添加空格a后面需要转义空格

#      ForceCommand cvs server
       port 10022
       allowrootlogin no
[root@tmp]# sed '$a         port 10022 
       allowrootlogin no'  /etc/ssh/sshd_config

        sed '/^$/d'  d.txt  #删除空行  /^$/ 正则表达式空行

        sed -n '/Error/p' log.txt   #日志文件中查找错误行 正则匹配错误行

sed替换命令

      -s:替换命令

      -g:(全局) 替换所有的匹配字符

      sed 's/false/true/' passwd

      sed 's/false/true/g' passwd

sed获取服务器ip(思路:获取行,替换ip前后面内容)

[root@~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.27.0.7  netmask 255.255.240.0  broadcast 172.27.15.255
        inet6 fe80::5054:ff:fe3c:c92e  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:3c:c9:2e  txqueuelen 1000  (Ethernet)
        RX packets 1115181672  bytes 312544971311 (291.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1033162772  bytes 520647988228 (484.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@~]# ifconfig eth0|sed -n '/inet /p'|sed 's/inet//'|sed 's/netmask.*$//'
         172.27.0.7       

sed高级操作命令

     -{ }:多个sed命令,用;分开

nl passwd|sed '{10,20d;s/faluse/true/g}  #删除10到20行 并且替换faluse为true

    -n: 读取下一个输入行(用下一个命令处理)sed是一行一行输入 -n表示下一行

        nl passwd|sed -n '1~2p' 跳行命令相似

  [root@tmp]# nl passwd|sed -n '{n;p}'   #第一行的下一行为第二行
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin

   -& :替换固定字符串 列子 sed 's/A/A12/'  改为使用固定字符串 sed 's/A/&12/'

#下面使用&处理passwd,将用户后面加两个空格
[root@tmp]# sed 's/^[a-z]+/&  /' passwd
root  :x:0:0:root:/root:/bin/bash
bin  :x:1:1:bin:/bin:/sbin/nologin
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

         案例一:大小写转换

               将用户名的首字母转换为大小/小写字母

             (元字符u l U L :转换为大写/小写字符)

[root@tmp]# sed 's/^[a-z]+/u&/' passwd  #首字母大小
Root:x:0:0:root:/root:/bin/bash
Bin:x:1:1:bin:/bin:/sbin/nologin
Daemon:x:2:2:daemon:/sbin:/sbin/nologin
Adm:x:3:4:adm:/var/adm:/sbin/nologin

            案例二: 将文件夹下的.txt 文件转换为大写

[root@SmartCommunity-Node01 tmp]# ls *.txt
a_w.txt  b.txt  cal.txt  d.txt
#W代表元字符[a-zA_Z_0-9]
[root@SmartCommunity-Node01 tmp]# ls *.txt|sed 's/^w+/U&/'
A_W.txt
B.txt
CAL.txt
D.txt

           案例三:数据筛选

                   “获取passwduseruidgid

[root@tmp]# sed 's/(^[a-z_-]+):x:([0-9]+):([0-9]+):.*$/USER:1  UID:2  GID3/' passwd
USER:root  UID:0  GID0
USER:bin  UID:1  GID1
USER:daemon  UID:2  GID2
USER:adm  UID:3  GID4

  -(  ) :替换某种(部分)字符串(1 ,2

           s/w1w2w3/w2/  :w1w2w3 替换成w2    

            使用()改写  s/w1(w2)w3/1/  

      案例:获取服务器ip

             ([0-9.]+)  代表ip

[root@tmp]# ifconfig eth0|sed -n '/inet /p'
        inet 172.27.0.7  netmask 255.255.240.0  broadcast 172.27.15.255
[root@tmp]# ifconfig eth0|sed -n '/inet /p'|sed 's/inet ([0-9.]+).*$/1/'
        172.27.0.7

 -r : 复制指定文件插入到匹配行

 -w :复制匹配行拷贝指定文件里

    源文件 <--互操作--> 目标文件

[root@tmp]# echo -e 'dfg
abc' > f.txt
[root@tmp]# more f.txt
dfg
abc
[root@tmp]# echo -e '123
456' >e.txt
[root@tmp]# more e.txt
123
456

#将文件f.txt读入到e.txt的第一行后面

[root@tmp]# sed '1r f.txt' e.txt
123
dfg
abc
456

w:写操作会改变写的文件(注意)

[root@tmp]# sed 'w f.txt' e.txt   #将e文件内容写入f (f相当于e的mv)
123
456
[root@tmp]# more f.txt
123
456
[root@tmp]# sed '1w f.txt' e.txt  #将e的第一行写入f (f就只有e的第一行内容)
123
456
[root@tmp]# more f.txt
123

-q: 退出sed

[root@tmp]# nl passwd |sed '/daemon/q'   #读到daemon就退出
     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

脚本格式

    sed -f scriptfile file(s)

做一个决定,并不难,难的是付诸行动,并且坚持到底。
原文地址:https://www.cnblogs.com/wukc/p/14633500.html