LINUX sed命令入门

一  sed简介

      1  sed 全名为 stream editor,流编辑器,用程序的方式来编辑文本,功能相当的强大。是贝尔实验室的 Lee E.McMahon 在 1973 年到 1974 年之间开发完成,目前可以在大多数操作系统中使用,sed 的出现作为 grep 的继任者。与vim等编辑器不同,sed 是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。

      2  sed会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

二  sed命令的常用选项

        格式:sed [选项] '条件指令' 文件.. ..

                   sed命令可以使用行号或正则做为条件匹配,条件可以为空代表匹配所有

        -n(屏蔽默认输出,默认sed会输出读取文档的全部内容)            

        -r(让sed支持扩展正则)

        -i(sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响)

三  sed命令实战

  1  sed工具的p指令案例集锦(查)

[root@svr5 ~]# sed -n 'p' a.txt            //输出所有行,等同于cat a.txt            
[root@svr5 ~]# sed -n '4p' a.txt            //输出第4行                                                       
[root@svr5 ~]# sed -n '4,7p' a.txt        //输出第4~7行
[root@svr5 ~]# sed -n '4,+10p' a.txt        //输出第4行及其后的10行内容
[root@svr5 ~]# sed -n '/^bin/p' a.txt        //输出以bin开头的行           
[root@svr5 ~]# sed -n '$=' a.txt  //输出文件的行数(看文件最后一行的行号 “=” 表示显示行号)
[root@svr5 ~]# sed -n '/root/=' /etc/passwd   //显示有root存在的行号
[root@svr5 ~]# sed -n '/$/=' /etc/passwd       //打印所有行号。

    2  sed工具的d指令案例集锦 (删)

[root@svr5 ~]# sed  '3,5d' a.txt             //删除第3~5行
[root@svr5 ~]# sed  '/xml/d' a.txt            //删除所有包含xml的行
[root@svr5 ~]# sed  '/xml/!d' a.txt         //删除不包含xml的行,!符号表示取反
[root@svr5 ~]# sed  '/^install/d' a.txt    //删除以install开头的行
[root@svr5 ~]# sed  '$d' a.txt                //删除文件的最后一行
[root@svr5 ~]# sed  '/^$/d' a.txt             //删除所有空行

   3  sed工具的s指令案例集锦:替换操作的分隔“/”可改用其他字符,如#&等,便于修改文件路径

[root@svr5 ~]# sed 's/xml/XML/'  a.txt        //将每行中第一个xml替换为XML
[root@svr5 ~]# sed 's/xml/XML/3' a.txt     //将每行中的第3个xml替换为XML
[root@svr5 ~]# sed 's/xml/XML/g' a.txt     //将所有的xml都替换为XML
[root@svr5 ~]# sed 's/xml//g'     a.txt     //将所有的xml都删除(替换为空串)
[root@svr5 ~]# sed 's#/bin/bash#/sbin/sh#' a.txt  //将/bin/bash替换为/sbin/sh
[root@svr5 ~]# sed '4,7s/^/#/'   a.txt         //将第4~7行注释掉(行首加#号)
[root@svr5 ~]# sed 's/^#an/an/'  a.txt         //解除以#an开头的行的注释(去除行首的#号)
[root@svr5 ~]# sed 's9\97\98\99\9\98\99' a.txt   ## 将97989更换为9989  
[root@svr5 ~]# sed 's/2017/xxxx/'    test.txt        //将每行中第一个2017替换为xxxx :  内存中修改
[root@svr5 ~]# sed 's/2017/xxxx/g'   test.txt       //将所有的2017替换为xxxx :  内存中修改
[root@svr5 ~]# sed 's/2017/xxxx/2'   test.txt       //将每行中的第二个2017替换为xxxx :内存中修改
[root@svr5 ~]# sed 's/2017//2'   test.txt               //将每行中的第二个2017替换为空,即删除
[root@svr5 ~]# sed -n 's/2017/xxxx/p  test.txt    // 将每行中的第一个2017替换为xxxx并打印
[root@svr5 ~]# sed '3s/2017/xxx/4' /test3.txt   //将第3行中的第4个2017替换为xxx
[root@svr5 ~]# sed -n '3s/2017/xxx/4p' /test3.txt  //将第三行的第4个2017替换为xxx,屏蔽默认输出。

4  sed工具的多行文本处理操作:

       i: 在指定的行之前插入文本

      a:在指定的行之后追加文本

      c:替换指定的行

[root@svr5 ~]# sed  '2a XX'   a.txt            //在第二行后面,追加XX
[root@svr5 ~]# sed  '2i XX'   a.txt            //在第二行前面,插入XX
[root@svr5 ~]# sed  '2c XX'   a.txt            //将第二行替换为XX

5 sed综合练习

[root@svr5 ~]# cat /nssw.txt
Hello the world
ni hao ma beijing
[root@svr5 ~]# sed 's/.//2;s/.$//' /nssw.txt   //删除文件中每行的第二个、最后一个字符
Hllo the worl
n hao ma beijin
[root@svr5 ~]# sed -r 's/^(.)(.*)(.)$/\3\2\1/' /nssw.txt //将文件中每行的第一个、倒数1个字符互换
dello the worlH
gi hao ma beijinn
[root@svr5 ~]# sed -r 's/[0-9]//g;s/^( )+//' nssw2.txt      //删除所有数字、行首空格
[root@svr5 ~]# sed -r 's/([A-Z])/[\1]/g' nssw.txt    //为文件中每个大写字母添加[]括号,使用“()”可实现保留功能
[root@svr5 ~]# cat /nssw1.txt
tom 155465
[root@svr5 ~]# sed -r  's/([0-9]+)/\0\0\0/' /nssw1.txt  //复制粘贴3次  这里0与1的使用效果一样。
Tom 155465155465155465

   6.利用sed编写脚本:找到使用bash作登录Shell的本地用户,列出这些用户的shadow密码记录,按每行“用户名 --> 密码记录” 输出。

[root@svr5 ~]# vim /userpass.sh

w=`sed -n '/bash$/s/:.*//p' /etc/passwd`
for i in $w
do
   pass1=$(grep $i /etc/shadow)
   pass2=${pass1#*:}
   pass3=${pass2%%:*}
   echo "$i------>$pass3"  
done

     

 

猜你喜欢

转载自blog.csdn.net/weixin_42104231/article/details/83419228
今日推荐