shell四剑客之sed

概述

Stream EDitor, 行编辑器

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

sed  三大功能 : (1)查找符合条件的行   (2)编辑被匹配到的行并输出到屏幕(最大的优点就是,输出出来的不会破坏文件本身) (3) 替换(其实这也算编辑)

注意:-i参数有危险,请慎用!如果非得要用,请备份。

-r 支持拓展正则表达式,原理同grep

用法: sed [option]… 'script' inputfile…

常用选项:

-n:不输出模式空间内容的自动打印

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

-r: 支持使用扩展正则表达式 -i: 原处编辑

script: '地址命令'

 地址定界:

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

(2) 单地址: #: 指定的行 /pattern/:被此处模式所能够匹配到的每一行

(3) 地址范围: #,# #,+# /pat1/,/pat2/ #,/pat1/

(4) ~:步进 1~2 奇数行 2~2 偶数行

编辑命令:

d: 删除模式空间匹配的行

p: 显示模式空间中的内容 a \text:在行后面追加文本;支持使用\n实现多行追加

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

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

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

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

=: 为模式空间中的行打印行号 !:模式空间中匹配行取反处理

s///:查找替换,支持使用其它分隔符,s@@@,s###

替换标记: g: 行内全局替换 p: 显示替换成功的行 w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

(1) 查找符合条件的行

[root@centous1 ~]# sed '2p' /etc/passwd   ## p参数 显示模式空间的内容这里直接加np,
root:x:0:0:root:/root:/bin/bash             被匹配的行是被重复出现的
bin:x:1:1:bin:/bin:/sbin/nologin                   
bin:x:1:1:bin:/bin:/sbin/nologin
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

[root@centous1 ~]# sed -n '2p' /etc/passwd ##  这里前边加-n参数, 只显示被匹配到的行
bin:x:1:1:bin:/bin:/sbin/nologin

[root@centous1 ~]# sed -n '2,10p' /etc/passwd  ###通过行数可以指定要查看的行
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

[root@centous1 ~]# sed -n '/root/p' /etc/passwd  #### 还可以通过关键词
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@centous1 ~]# sed -n '2,/root/p' /etc/passwd  ####### 行数和关键词的结合使用,来查找行
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

[root@centous1 ~]# cat f1
1

2

3

4

5
[root@centous1 ~]# sed -n '/^$/=' f1    显示空行号  ‘=’ 显示行号
2
4
6
8

(2) 编辑匹配的行

a 在行后添加文本  i 在行前添加文本  c替换源文件文本 
[root@centous1 ~]# sed -e '/1/a\user1' -e '/2/i\user2' -e '/3/c\user3' f1 
1                 ## 特别说明,-e参数,多点编辑  
user1

user2
2

user3

4

5

[root@centous1 ~]# sed '/^$/d' f1  ###删除空行  d  参数,删除匹配到的行
1
2
3
4
5

[root@centous1 ~]# sed '/^$/d' f1 | sed '1,3d'  ### 可以指定删除多少行
4
5

[root@centous1 ~]# cat f1 | sed '1a tea' #### 指定哪一行添加或者替换
1
tea

2

3

4

5

(3)替换

[root@centous1 ~]# cat f1
aaa
bbb
ccc
ddd
eee
fff
[root@centous1 ~]# sed 's/aaa/abc/g' f1 ## s参数的标志就是替换模式,其中三个'/'可以使其他的标 
abc                点符号(@@@或者###...等)g参数表示全局替换,           
bbb                  如果不加,就只替换第一个匹配到的。       
ccc
ddd
eee
fff

[root@centous1 ~]# sed -n 's/root/&supermen/p' /etc/passwd ##在替换的词前边加&,表示前边被替换
rootsupermen:x:0:0:root:/root:/bin/bash              的还存在,只是在后边添加
operator:x:11:0:operator:/rootsupermen:/sbin/nologin
  
[root@centous1 ~]# sed -n 's/root/supermen&/p' /etc/passwd  ## 同理在后边添加&,表示前边被替
supermenroot:x:0:0:root:/root:/bin/bash                 换的还存在,只是在前边添加
operator:x:11:0:operator:/supermenroot:/sbin/nologin

然后我们来介绍一下危险的-i参数

-i:直接修改读取的档案内容,而不是由萤幕输出。
如果对自己的命令操作十分自信,可以用他来编辑文件,但是也要确保安全,这时我们可以用以下方法,修改之前
做个备份
[root@centous1 ~]# cp /etc/passwd f1
[root@centous1 ~]# sed -i.bak 's/root/supermen/g' f1
[root@centous1 ~]# cat f1
supermen:x:0:0:supermen:/supermen:/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
[root@centous1 ~]# ls -a
.                .bash_history  .cshrc  install.log         .pki    
..               .bash_logout   f1      install.log.syslog  .tcshrc    
123.sh           .bash_profile  f1.bak    

且用且珍惜

高级编辑命令:

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

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

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

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

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

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

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

d: 删除模式空间中的行

D:删除当前模式空间开端至\n的内容(不在传至标准输 出),放弃之后的命令,但是对剩余模式空间重新执行sed

示例;

sed -n 'n;p' FILE

sed '1!G;h;$!d' FILE

sed '$!N;$!D' FILE

sed '$!d' FILE

sed ‘G’ FILE

sed ‘g’ FILE

sed ‘/^$/d;G’ FILE

sed 'n;d' FILE

sed -n '1!G;h;$p' FILE

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

(1)
forestforest
上一篇 2016-08-15 14:31
下一篇 2016-08-15 14:31

相关推荐

  • shell脚本执行

    shell脚本执行 对于我们这些小白而讲,shell脚本无疑是最令人头疼的事了,我再这里讲一下shell脚本运行要注意的哪些。 shell脚本就好像c++,java代码一样,按照从上到下然后从左到右的顺序执行。就像我们日常读书一样。如果shell命令遇见了子进程(嵌套代码),程序就会跟着顺序进入子进程。当子进程完成后,回到父进程,并且把父进程所需要的参数提交…

    2017-06-05
  • 计算机组成及Linux基础

    第1题:描述计算机的组成及功能 1.1计算机的组成       计算机是有 运算器,控制器,存储器,输入设备和输出设备组成计算机 1.2计算机各部件功能 运算器 对数据进行算术运算,逻辑运算和对数据进行加工处理 存储器 存储程序,数据和各种信号,命令等信息,并在需要时提供这些信息 控制器 是整个计算机的中枢神…

    Linux干货 2017-07-02
  • iptables练习

    iptables练习 一、COMMAND 1、列出所有链的规则:iptables -L ,显示某条链的规则就是iptables -L INPUT 详细信息:iptables -vnL 2、清楚所有链的规则 :iptables -F 3、设置默认规则策略:iptables -P INPUT DROP,iptables -P OUTPUT DROP , ipta…

    Linux干货 2016-12-20
  • linux树状结构

    linux 目录结构   /:根目录,一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中 /bin:/usr/bin:可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。 /boot:放置linux系统启动时用到的一些文件。/boot/vmlinuz为linux的内核文…

    Linux干货 2016-08-05
  • 谷歌三大核心技术(一)The Google File System中文版

    摘要 我们设计并实现了Google GFS文件系统,一个面向大规模数据密集型应用的、可伸缩的分布式文件系统。GFS虽然运行在廉价的普遍硬件设备上,但是它依然了提供灾难冗余的能力,为大量客户机提供了高性能的服务。 虽然GFS的设计目标与许多传统的分布式文件系统有很多相同之处,但是,我们的设计还是以我们对自己的应用的负载情况和技术环境的分析为基础的,不管现在还是…

    Linux干货 2015-04-13
  • Linux 进程及作业管理

    一 进程、线程、程序概念 1、进程(Process) 什么是进程,简单的说,进程是程序的执行实例,即运行中的程序,同时也是程序的一个副本;程序是放置于磁盘的,而运行中的程序是位于内存中的。 2、线程(Thread) 一个进程至少包括一个线程,通常将该线程称为主线程,所以线程是比进程更小的单位,是系统分配处理器时间资源的基本单元。一个进程要想同时在多颗CPU上…

    Linux干货 2016-03-15