• Linux sed命令详解


            sed是一种流编编器,它是文本处理中非常中的工具,能够完美的配合正则表达式便用,功物能不同凡响。

    处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间”( oattern space),接看用sed命令处理缓冲区中的内容,处理成后,把缓冲区的内容送往屏幕显示。

    接着理下一行,这样不断重复,直到文件末。文件内容没有改改变,除非使用了写入的命令,将内容更新。

    定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。

    sed命令功能

     命令	 功能
     a\	 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
    
     c\	 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
    
     i\	 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
    
     d	 删除行
    
     h	 把模式空间里的内容复制到暂存缓冲区
    
     H	 把模式空间里的内容追加到暂存缓冲区
    
     g	 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
    
     G	 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
    
     l	 列出非打印字符
    
     p	 打印行
    
     n	 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
    
     q	 结束或退出sed
    
     r	 从文件中读取输入行
    
     !	 对所选行以外的所有行应用命令
    
     s	 用一个字符串替换另一个
    
     g	 在行内进行全局替换
    
     w	 将所选的行写入文件
    
     x	 交换暂存缓冲区与模式空间的内容
    
     y	 将字符替换为另一字符(不能对正则表达式使用y命令)
    

    sed常见命令参数

     p==print 
     d:delete
     =:打印匹配行的行号
     -n 取消默认的完整输出,只要需要的  
     -e 允许多项编辑
     -i 修改文件内容
     -r 不需要转义
    注意:& 符号在sed命令中代表上次匹配的结果 

    常用的命令展示

    sed擅长行输出,附源文件:

    hhh     pts/1        192.168.25.1     Sat Jun 30 22:04   still logged in   
    reboot   system boot  2.6.32-358.el6.i Sat Jun 30 22:04 - 22:43  (00:38)    
    omc     pts/0        192.168.25.1     Sat Jun 30 20:16 - down   (00:00)    
    reboot   system boot  2.6.32-358.el6.i Sat Jun 30 19:38 - 20:16  (00:37)    
    root     pts/1        192.168.25.1     Sat Jun 30 12:20 - down   (00:55)    
    root     pts/0        192.168.25.1     Sat Jun 30 11:53 - down   (01:22)    
    reboot   system boot  2.6.32-358.el6.i Sat Jun 30 11:52 - 13:15  (01:23)    
    root     pts/0        192.168.25.1     Sat Jun 30 05:40 - down   (02:51)    
    reboot   system boot  2.6.32-358.el6.i Sat Jun 30 05:38 - 08:32  (02:54)    
    root     pts/0        192.168.25.1     Fri Jun 29 21:01 - down   (06:21)    
    
    wtmp begins Tue Jun  9 03:57:56 2015

    只打印第三行

    sed -n '3p' /var/log/yum.log

    image

    只查看文件的第3行到第9行

    sed -n '3,9p' /var/log/yum.log

    image

    过滤特定字符串,显示正行内容  

    sed -n  '/root/p' yum.log

    image

    显示包含"hhh"的行到包含"omc"的行之间的行

    sed -n '/hhh/,/omc/p' yum.log 

    image

    打印1-5行,并显示行号

    sed -n -e '1,5p' -e '='  yum.log

    image

    仅仅显示匹配字符串的行号

     sed -n '/root/p' yum.log 

    image 

    打印匹配行的内容和符号【相当于后面又根据关键词查询了一次】

    sed -n -e '/root/p' -e '/root/=' yum.log

    image

    用world 替换yum.log文件中的root【真实写入】

    sed -i 's/root/world/g' yum.log
    ==>sed -i 's#hhh#HHHH#g' h.txt     与上同
                  s==search  查找并替换
                  g==global  全部替换
                  -i: implace
    

    image

    打印最后一行

    sed -n '$p' yum.log

    image

    在文件第一行添加happy,文件结尾添加new year

    sed -e '1i happy' -e '$a new year' yum.log       【界面显示】
    sed -i -e '1i happy' -e '$a new year' yum.log    【真实写入文件】
    

    image

    在文件第一行和第四行的每行下面添加hahaha

    sed '1,4i hahaha' yum.log       

    image

    & 符号在sed命令中代表上次匹配的结果

    sed 's/world/hello_&/g' yum.log   

    image

    删除第3到第9行,只是不显示而已

    sed  '3,9d' /var/log/yum.log

    image

    删除包含"hhh"的行到包含"omc"的行之间的行

    sed '/hhh/,/omc/d' yum.log

    image

    删除包含"omc"的行到第十行的内容

    sed '/omc/,10d' yum.log

    image
    备注:范围可以用数字、正则表达式、或二者的组合表示

    显示中5到10行里匹配root,把行内所有的root替换为FTL,并打印到屏幕上

     sed '5,10 s/root/FTL/g' yum.log【仅显示用】
     sed -i sed '5,10 s/root/FTL/g' yum.log【-i 会真正替换信息】
    

    image

    -e是编辑命令,用于多个编辑任务

    删除1到5行后,替换reboot为shutdown
    sed -e '1,5d' -e '=' -e 's/reboot/shutdown/g'  yum.log  
    

    image

    打印3到6行的内容,并匹配reboot替换为shutdown

    sed -n -e '3,6p' -e 's/reboot/shutdown/g'  yum.log  

    image

    -r命令是读命令。sed使用该命令将一个文本文件中的内容加到当前文件的特定位置上

    [root@localhost log]# cat test.txt 
    [root@localhost log]# sed '/root/ r /var/log/test.txt' yum.log  【yum.log  匹配root后读入text.txt的内容在匹配内容之下,仅显示用】

    image

    -w是写入命令

    sed  '/root/ w /home/omc/root.txt' yum.log       【yum.log匹配root后写入root.txt',真实写入】
    sed -n '/root/ w /home/omc/root.txt' yum.log    【添加-n参数后,不打印源文件】
    ll /home/omc/root.txt

    image

    打印1-5行,并显示行号

    sed -n -e '1,5p' -e '='  yum.log 

    image

    sed的正则匹配

    正则匹配IP和子网掩码

    [root@localhost log]#  ifconfig |sed -n '2p'
          [root@localhost log]# ifconfig |sed -n '2p' | sed -r 's#.*r:(.*) B.*k:(.*)#\1 \2#g' 
    
          (.*)表示匹配的项,之后可以用\1取出第一个括号内匹配的内容,\2取出第二个括号内匹配的内容  
    

    image

    配合find命令的使用

    find . -name  "*.txt" |xargs   sed -i 's/hhhh/\hHHh/g' 
    find . -name  "*.txt" |xargs   sed -i 's#hhhh#hHHh#g' 
    find . -name  "*.txt" -exec sed -i 's/hhhh/\hHHh/g' {} \;
    find . -name  "*.txt" |xargs cat

    sed错误使用

    sed 's#,# #h' h.txt | cut -d" " -f 3,5 h.txt    <-- 错误的用法,前面已经处理了,后面又用cut查看h.txt文件
    sed 's#,# #h' h.txt | cut -d" " -f 3,5          --> 正确的用法
    作者:小a玖拾柒

    -------------------------------------------

    个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~

    本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!

  • 相关阅读:
    Python字典dict对象方法总结
    PythonString字符串的相关方法
    Mysql5.7.20使用group by查询(select *)时出现错误修改sql mode
    HtmlTestRunner无法生成HTML报告问题
    话说 type 之 record 记录的使用技巧 F#
    Silverlight OOB 获取桌面可视尺寸 F# PInvoke
    目前让 F# 支持 Silverlight 5 的解决方案(包括 lazy 不可用)
    话说 type 之 let 绑定与 val 显式字段 F#
    这两天自己模仿写的一个Asp.Net的显示分页方法 附加实体转换和存储过程 带源码下载
    Asp.net 在三层架构中事务的使用
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9250171.html
Copyright © 2020-2023  润新知