文本处理工具-2

1、 sed 是一种行/流编辑器,它一次处理一行内容;处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中该行内容,处理完成后,把缓冲区的该行内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出,Sed 可以用来自动编辑一个或多个文件。

2、 sed命令的用法(除非使用-i选项,不改变原文件内容)

1)、用法:sed [option]… 'script' inputfile…

2)、常用选项:

-n:不输出模式空间所有行的自动打印,而脚本命令p打印模式空间中被脚本指定地址的行,又因为sed命令本身就默认输出模式空间所有行的自动打印,所有-n选项和脚本命令p的同时使用就只打印模式空间中被脚本指定地址的行

     -e:多点编辑

     -f /PATH/TO/SCRIPT_FILE:从指定文件中读取编辑脚本

     -r:支持使用扩展正则表达式

     -i:原处编辑

    例如#sed –i ‘/^U/r /etc/issue’ fi,屏幕无打印显示,但是修改了原文件fi

    #sed –i ‘/^U/r /etc/issue’ fi

屏幕无打印显示,修改了原文件fi,但是在当前目录生成了fi原文件备份文件ffi.bak

3)、script(脚本)格式:'地址命令',必须同时包含地址和脚本命令,使用多个脚本命令,中间用;分开

script地址定界:

(1)不给地址:对全文进行处理(默认)

(2)单地址:

#:指定的行

/pattern/:被此处模式所能够匹配到的每一行

(3)地址范围:

#,#:从第#行到第#行

#,+#

/pat1/,/pat2/

#,/pat1/

(4)步进:用符号~表示

1~2  奇数行

2~2  偶数行

script编辑命令/脚本命令:

d: 删除模式空间匹配的行,删除的模式空间处理行不再在屏幕上显示

p: 显示模式空间中的内容

a \text:在行后面追加文本;支持使用\n 实现多行追加

i \text:在行前面插入文本;支持使用\n 实现多行插入

c \text:替换为单行或多行文本

w /path/to/somefile: 保存模式匹配的行至指定文件

r /path/from/somefile:读取指定文件的文本至模式空间中匹配到的行后

=: 为模式空间中的行打印行号

!: 模式空间中匹配行取反处理

例如#cat /etc/fstab > fi

#sed ‘3d’ fi,屏幕打印显示的fi文件内容的第三行被删除,但是fi文件本身没有改变

    #sed –n ‘3d’ fi,屏幕上无打印输出

    #sed ‘3,6p’ fi,屏幕打印显示且重复显示3-6行

    #sed –n ‘3,6p’ fi,屏幕打印显示3-6行

    #sed –n ‘1~2p’ fi,屏幕打印显示奇数行

    #sed –n ‘/^U/p’ fi,屏幕打印显示以U开头的行

    #sed ‘/^U/a \xxhhjjkk’ fi,屏幕打印显示且以U开头的行后新行追加文本xxhhjjkk

    #sed ‘/^U/a \xxhhjjkk\nbbccddee\nrtrt’ fi

屏幕打印显示且以U开头的行后分三行分别追加文本xxhhjjkk、bbccddee、rtrt

#sed ‘/^U/w /testdir/U.txt’ fi

 #sed  -n ‘/^U/w /testdir/U.txt’ fi, 把文件fi中以U开头的行存入文件/testdir/U.txt

#sed '/^U/=' fi,打印显示fi文件中以U开头的行的行号

#sed '/^U/!=' fi,打印显示fi文件中非以U开头的行的行号

4)、s///:查找替换, 支持使用其它分隔符,例如s@@@ ,s###

替换标记:

g:行内全局替换,如果不加g,则仅仅替代行中第一个模式匹配

p:显示替换成功的行

w  /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

ffi文件内容:good good good

              xxhhjjkk                              god god god  

例如#sed ‘s/good/god/gp’ ffi,屏幕打印输出结果是:god god god

                                                    xxhhjjkk

但是加上-n选项,输出结果就是:god god god 

    #sed ‘s/good/god/gw /root/fffi’ffi,将替换成功的行保存在文件/root/fffi中

                                                  

5)、示例:

#sed –n ‘2,/root/p’ /etc/passwd  打印显示第2行到第一个包含有root字符的行

#sed –n –e ‘/^$/p’ –e ‘/^$/=’ file 打印显示空行及相应的行号(不打印白行及相应行号)

#sed ‘/^$/d’ file 打印显示删除所有空行,但是原文件没有改变

#sed –n‘s/root/&superman/p’ /etc/passwd  ,第一个root字符串后添加superman

#sed –n‘s/root/superman&/p’ /etc/passwd  ,第一个root字符串前添加superman

#sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets,所有的dog字符串替换成cat字符串,同时

#sed –i.bak ‘s/dog/cat/g’ pets ,修改原文件时备份原文件为pets.bak

3、sed命令的高级编辑命令/高级脚本命令

1)、高级编辑命令:

其中模式空间相当于多工序加工车间,保持空间相当于临时仓储仓库

h: 把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

x: 把模式空间中的内容与保持空间中的内容进行互换

n: 读取匹配到的行的下一行覆盖至模式空间

N:追加匹配到的行的下一行至模式空间

d: 删除模式空间中的行

D:删当前模式空间中的行

2)示例:

#sed -n 'n;p' FILE,只打印显示偶数行(不考虑n选项,起始自动读第一行进入模式空间,然后判断脚本命令n,读取匹配到的第一行的下一行第二行覆盖至模式空间,而后判断脚本命令p,默认打印第一行第二行同时再次打印第二行;接着读取第三行进入模式空间,然后判断脚本命令n,读取匹配到的第三行的下一行第四行覆盖至模式空间,而后判断脚本命令p,默认打印第三行第四行同时再次打印第四行;依次…;考虑n选项,默认打印不再输出,所以只打印输出偶数行)

   #sed '1!G;h;$!d' FILE,倒序排列,相当于#tac FILE(第一行不执行G,不是第一行就执行G,然后执行第二条命令h,最后一行不删除,不是最后一行就删除;起始自动读第一行进入模式空间,然后判断因为是第一行所以不执行G,接着执行第二条命令h,把模式空间中的第一行覆盖至保持空间,然后判断因为不是最后一行所以情况模式空间,也就不打印显示第一行;第二行进入模式空间…)

   #sed '$!N;$!D' FILE,只留最后两行,相当于#tail -2 FILE

   #sed '$!d' FILE, 只留最后一行,相当于#tail -1 FILE

   #sed ‘G’ FILE,在每行的后面加一空行

   #sed ‘g’ FILE,用空行覆盖每一行

   #sed ‘/^$/d;G’ FILE, 删除所有的空行,然后在每行后加一个空行

   #sed 'n;d' FILE打印显示奇数行

   #sed -n '1!G;h;$p' FILE倒序排列,相当于#tac FILE

 

原创文章,作者:18612763863,如若转载,请注明出处:http://www.178linux.com/31896

(0)
1861276386318612763863
上一篇 2016-08-15
下一篇 2016-08-15

相关推荐

  • 马哥linux0803作业内容

    1. 创建sysadmins组 将用户user1,user2,user3加入sysadmins组中 将user3设置为sysadmins的管理员 用user3登录,将user2从组中移除 设置sysadmins的密码centos 设置user1 在创建新文件时,文件的所属组为sysadmins 删除user1…3 删除sysadmins 2、三种权限rwx对…

    Linux干货 2016-08-04
  • 2016全球运维大会,优云蒋君伟演讲“CMDB+自动化的管理融合”成一大亮点

    2016全球运维大会于9月23日-24日在上海盛大开幕。作为国内运维行业的重量级大会,优云产品总监蒋君伟在自动化专场与来自全国各地的运维同行一起探讨、分享业内自动化运维的最佳实践。现场情绪热烈,气氛高涨,成为了本届全球运维大会的一大亮点。 全新梳理自动化与CMDB的融合之道 全球运维大会当天,运维自动化专场很多大牛针对自动化运维管理中的CMDB进行了激烈的讨…

    Linux资讯 2016-12-05
  • 人志建,则无敌—if、case练习

    马哥21期网络班-9周博客作业 1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash for i in `cut -d: -f7 /etc/passwd`;&…

    Linux干货 2016-09-05
  • 软链接和硬链接详解

    软连接和硬链接图解 硬链接 符号链接 软链接和硬链接详解 软链接和硬链接详解 Linux下的链接文件有点类似于Windows的快捷方式,但又不完全一样。链接文件有两种:一种是硬链接,另一种是符号链接(又称软链接)。 UNIX文件系统提供了一种将不同文件链接至同一个文件的机制,我们称这种机制为链接。它可以使得单个程序对同一文件使用不同的名字。这样的好处是文件系…

    Linux干货 2016-09-06
  • gzip压缩输出

    一、gzip介绍          gzip是GNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也经常用来表示gzip这种文件格式。软件的作者是Jean-loup Gailly和Mark Adler。1992年10月31日第一次公开发布,版本号是0.1,目前的稳定版本是…

    Linux干货 2015-07-29
  • N25-第三周作业

      列出当前系统上所有已经登陆的用户的用户名,注意:同一个用户登陆多次,则只显示一次即可。     2.取出最后登陆到当前系统的用户的相关信息。     3.取出当前系统上被用户当作其默认shell的最多的那个shell.     4.将/etc/password中的第三个字段数值最大的后…

    Linux干货 2016-12-19