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
下一篇 2016-08-15

相关推荐

  • CentOS7内核编译

    一.centos7内核编译(支持ntfs文件系统) 1.下载内核源代码内核文件(https://www.kernel.org/) 2.解压缩源代码文件到指定目录 tar xvf linux-4.8.10.tar.xz -C /usr/src 3.创建软链接解压后的文件 cd /usr/src ln -s linux-4.8.10/ linux 4.复制当前系…

    Linux干货 2016-11-28
  • 用户创建及权限管理

    1.列出当前系统上所有已经登录的用户的用户名,注:同一个用户登录多次,则只显示一次即可。 who | cut -d ‘ ‘ -f1 | sort -u [root@localhost ~]# who danry :0 2017-07-16 23:20 (:0) danry pts/0 2017-07-16 23:23 (192.168…

    Linux干货 2017-07-17
  • gawk基础

    gawk程序是Unix中原始awk程序的GNU版本。gawk程序让流编辑器迈上了一个新的台阶,它提供了一种编程语言而不只是编辑器命令。在gawk编程语言中,可以完成下面的事情: (1)定义变量来保存数据; (2)使用算数和字符串操作符来处理数据; (3)使用结构化编程概念(比如if-then语句和循环)来为数据处理增加处理逻辑; (4)通过提取数据文件中的数…

    Linux干货 2017-05-22
  • N26-第五周

    1、显示当前系统上root、fedora或user1用户的默认shell; [root@localhost test]# cat /etc/passwd | grep -E “^(root|fedora|user1)\>” |cut -d: -f  1,7 root:/bin/bash user1:/bin/bash …

    Linux干货 2017-02-26
  • 初识Linux

    1 硬件:cpu,内存,输入输出设备 功能:计算,存放cpu暂时计算的数据,接受输入和输出反应 2 Debian Ubuntu => mint knopix Slackware: S.u.S.E => OpenSUSE SLES RedHat: RedHat Enterprise Linux => CentOS FedoraCore 3 1…

    Linux干货 2017-07-11
  • vim编辑器

                在Linux的学习中,无论是编写脚本还是修改文件内容,我们最经常用的就是vim编辑器.vim编辑器功能十分强大,如今不仅仅只应用在Linux中.今天就来介绍一下vim编辑器的功能 进入和退出vim     进入:   在终端输入vim 文件名 ,…

    Linux干货 2017-08-05