文本处理三剑客–sed使用详解

处理文本的工具sed

Stream EDitor     行编辑器

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

 

sed 工具

用法:

sed [option]… ‘script’ inputfile…

常用选项:

   -n:不输出模式空间内容到屏幕,即不自动打印

   -e:多点编辑

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

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

   -i.bak:备份文件并原处编辑

script:

地址命令

 

地址定界:

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

(2)单地址:

#:指定的行

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

(3)地址范围:

#,#

#,+#

/pat1/,/pat2/

#,/pat1/

(4) ~ :步进

1~2  奇数行

2~2  偶数行

 

编辑命令:

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

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

a [\]text:在指定行后面追加文本

支持使用\n实现多行追加

i [\]text:在行前面插入文本

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

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

r /path/somefile:读取指定文件的文本至模式空间中

匹配到的行后

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

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

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

替换标记:

g:  行内全局替换

p:  显示替换成功的行

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

实例:

显示/etc/passwd中的内容

[root@localhost ~]#sed 'p' /etc/issue
CentOS release 6.8 (Final)
CentOS release 6.8 (Final)
Kernel \r on an \m
Kernel \r on an \m
 
[root@localhost ~]#sed -n 'p' /etc/issue
CentOS release 6.8 (Final)
Kernel \r on an \m

打印出第五行

[root@localhost ~]#sed -n '5p' /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

在输入第二行时,会再打印一遍

[root@localhost ~]#sed -n '2p' 
a
b
b
c

可配合管道及重定向使用

[root@localhost ~]#sed -n '2p' < /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]#sed -n '2p'  /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]#cat /etc/passwd | sed -n '2p'
bin:x:1:1:bin:/bin:/sbin/nologin

sed可处理前面命令的输出

[root@localhost ~]#seq 10 | sed -n '9p'
9

打印/etc/passwdroot开头的行

[root@localhost ~]#sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash

打印出/etc/passwd中的1020

[root@localhost ~]#sed -n '10,20p' /etc/passwd
10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11  operator:x:11:0:operator:/root:/sbin/nologin
12  games:x:12:100:games:/usr/games:/sbin/nologin
13  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
14  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
15  nobody:x:99:99:Nobody:/:/sbin/nologin
16  dbus:x:81:81:System message bus:/:/sbin/nologin
17  usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
18  rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
19  rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin
20  avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin

打印以h开头的行到以n开头的行的所有内容

[root@localhost ~]#sed -n '/^h/,/^n/p' /etc/passwd
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
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin

奇数或偶数步进

[root@localhost ~]#seq 10 | sed -n '1~2p'
1
3
5
7
9
[root@localhost ~]#seq 10 | sed -n '2~2p'
2
4
6
8
10

删除/etc/passwd偶数行

[root@localhost ~]#cat -n /etc/passwd | sed '2~2d'
     1  root:x:0:0:root:/root:/bin/bash
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    11  operator:x:11:0:operator:/root:/sbin/nologin

/etc/passwd 一至三行后追加文本

[root@localhost ~]#cat /etc/passwd | sed '1,3a------Rookie'
root:x:0:0:root:/root:/bin/bash
------Rookie
bin:x:1:1:bin:/bin:/sbin/nologin
------Rookie
daemon:x:2:2:daemon:/sbin:/sbin/nologin
------Rookie
adm:x:3:4:adm:/var/adm:/sbin/nologin
 
[root@localhost ~]#cat /etc/passwd | sed '1,3a\   ------Rookie'
root:x:0:0:root:/root:/bin/bash
   ------Rookie
bin:x:1:1:bin:/bin:/sbin/nologin
   ------Rookie
daemon:x:2:2:daemon:/sbin:/sbin/nologin
   ------Rookie
adm:x:3:4:adm:/var/adm:/sbin/nologin

在二至四行前面追加文本,相当于在一至三行后

[root@localhost ~]#cat -n /etc/passwd | sed '2,4i\   ------Rookie'
     1  root:x:0:0:root:/root:/bin/bash
   ------Rookie
     2  bin:x:1:1:bin:/bin:/sbin/nologin
   ------Rookie
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
   ------Rookie
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin

替换二至四行为——Rookie

[root@localhost ~]#cat -n /etc/passwd | sed '2,4c\------Rookie'
     1  root:x:0:0:root:/root:/bin/bash
------Rookie
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync

可用\n实现多行追加

[root@localhost ~]#cat -n /etc/passwd | sed '2,4c\------Rookie \n======'
     1  root:x:0:0:root:/root:/bin/bash
------Rookie
======
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

/etc/passwd的三至六行保存至指定文件

[root@localhost ~]#cat /etc/passwd | sed -n '3,6w shiyan'
[root@localhost ~]#cat shiyan
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

为匹配的行打印行号

[root@localhost ~]#cat /etc/passwd | sed '1,10='
1
root:x:0:0:root:/root:/bin/bash
2
bin:x:1:1:bin:/bin:/sbin/nologin
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
5
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

将文件中的二至五行删除

[root@localhost ~]#seq 10 > shiyan
[root@localhost ~]#sed -i '2,5d' shiyan
[root@localhost ~]#cat shiyan
1
7
8
9
10

[root@localhost ~]#cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]#sed 's/root/ROOT/g' /etc/passwd
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
 
[root@localhost ~]#sed -n 's/root/ROOT/gp' /etc/passwd
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
[root@localhost ~]#sed -n 's@root@ROOT@gp' /etc/passwd
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin

sed  -n  '2p'  /etc/passwd
只打印第二行
sed  -n  '1,4p'  /etc/passwd
打印一至四行
sed  -n  '/root/p'  /etc/passwd
打印包含root的行
sed  -n  '2,/root/p'  /etc/passwd  
sed  -n  '/^$/='  /etc/fstab
显示空行行号
sed  -n  -e  '/^$/='  -e  '/^U/=' /etc/fstab
打印空行行号和U开头行的行号
sed -n '/^$/=' -e '/^U/p' /etc/fstab
打印空行行号和U开头的行
sed -n -e '/^U/=' -e '/^U/p' /etc/fstab
打印行号并打印行内容
sed  '/root/a\Rookie'  /etc/passwd 行后
在符合条件的行后添加Rookie
sed  '/root/i\Rookie'  /etc/passwd  行前
在符合条件的行前添加Rookie
sed  '/root/c\Rookie'  /etc/passwd  代替行
用Rookie代替符合条件的行

高级编辑命令:

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

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

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

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

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

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

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

   d:删除模式空间中的行

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

 

取奇偶数

[root@localhost ~]#seq 10 | sed 'n;d'
1
3
5
7
9
[root@localhost ~]#seq 10 | sed -n 'n;p'
2
4
6
8
10

倒序显示

[root@localhost ~]#seq 10 | sed '1!G;h;$!d' 或者seq 10 | sed -n '1!G;h;$p'
10
9
8
7
6
5
4
3
2
1

最后两行

[root@localhost ~]#seq 10 |  sed '$!N;$!D'
9
10

最后一行

[root@localhost ~]#seq 10 | sed '$!d'
10

每行后加空行

[root@localhost ~]#seq 10 | sed '/^$/d;G'
1
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9
 
10


使用技巧:

取IP地址

[root@localhost ~]#ifconfig eth0 | sed -n 2p | sed -e 's/.*r://' -e 's/B.*//'
192.168.101.128
[root@localhost ~]#ifconfig eth0 | sed '2!d;s/^.*r://;s/ .*//'
192.168.101.128

取文件名

[root@localhost ~]#echo /etc/sysconfig/network-scripts/ | sed -r 's@(^/.*/)([^/]+/?)@\1@'
/etc/sysconfig/

取基名

[root@localhost ~]#echo /etc/sysconfig/network-scripts/ | sed -r 's@(^/.*/)([^/]+/?)@\2@'
network-scripts/

对/etc/fstab中非#号开头的行加注释符

[root@localhost ~]#sed -r 's/(^[^#])/#\1/' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Mar 24 05:37:40 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
#UUID=1fd1710f-ff1a-4eba-94f8-c57ecc05d6c6 /              ext4    defaults        1 1
#UUID=34e5ffbe-c2b3-4745-89bc-1811245ae758 /boot         ext4    defaults       1 2
#UUID=abf30893-850f-4a50-9a0c-e5e153873eb4 /data         ext4    defaults       1 2
#UUID=53e082c2-f1fc-4b96-aa31-d9071dc6355c /home         ext4    defaults      1 2
#UUID=7a8216c5-6781-4494-b2da-fda672f117ad swap          swap    defaults        0 0
#tmpfs                   /dev/shm                tmpfs   defaults        0 0
#devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
#sysfs                   /sys                    sysfs   defaults        0 0
#proc                    /proc                   proc    defaults        0 0

 删除/etc/inittab文件中的空行    

 [root@localhost ~]#cat /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,

[root@localhost ~]#sed '/^$/d' /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,

 

 

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

(0)
Linux.rookieLinux.rookie
上一篇 2017-05-21
下一篇 2017-05-21

相关推荐

  • 马哥教育网络班21期+第三周博客作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 方法1: [root@zabbix ~]# who |awk '{print $1}'|sort -n|uniq monitor root 方法2: [root@zabbix ~]#…

    Linux干货 2016-07-22
  • N25期—第一周作业

    1、描述计算机的组成及其功能 计算机五大组成部件:运算器、控制器、存储器、输入设备和输出设备。 运算器和控制器统称中央处理器(CPU)。  存储器分成内存储器和外存储器两大类。  外存储器、输入设备和输出设备统称为外部设备。  中央处理器(CPU)  计算机的中央处理器又称为CPU,它是计算机的核心部分。主要由运算器和…

    Linux干货 2016-12-04
  • 文件查看和正则表达式

    文件查看工具         cat,tac,rev,more,less,head,tail cat:查看文本          cat [OPTION]… [FILE]… &…

    Linux干货 2016-08-07
  • 文本查看类命令

    文本查看相关的命令:1.  cat – 串连文件,并以标准输出显示语法:cat [OPTION]… [FILE]… 常用选项 选项 | 含义—— | ——-n | 在显示文件内容时打印行号示例:~]# cat -n /etc/rc.d/init.d/functions显示/e…

    2017-09-07
  • 练习

    练习 显示/proc/meminfo文件中以大小s开头的行;     显示/etc/passwd文件中不以/bin/bash结尾的行     找出/etc/passwd中的两位或三位数     显示/etc/grub2.cfg文件中,至少以一个空白字符开头的 且后面存非空白字符的行   &…

    Linux干货 2016-08-12
  • 一张图认识开源世界

    开源精神:自由,创新,团结,互助,友爱,积极,进取。在开源环境下也产生了很多优秀的软件,让我们通过一幅图认识一下开源世界里的大咖们! 看图识物     墙上挂的牛头:伟大的开源计划GNU Wiki:http://zh.wikipedia.org/zh-cn/GNU     墙上日历上的信封标志:经典的linux下的邮件…

    Linux干货 2015-03-20