文本处理三剑客–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)
上一篇 2017-05-21 20:26
下一篇 2017-05-21 20:39

相关推荐

  • N26-博客作业-week6

    vim:Vi IMprove 基本模式:编辑模式,命令模式输入模式末行模式 打开文件: vim [option] [file…] +#:打开文件后,直接让光标处于第#行的行首+/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首 模式转换:编辑模式:默认模式编辑模式 –> 输入模式:i:insert…

    Linux干货 2017-03-12
  • Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

    Linux系统启动流程、内核及模块管理 Linux系统的组成部分组成:内核+根文件系统(kernel+rootfs)内核(kernel): 进程管理(创建、调度、销毁等)、内存管理、网络管理(网络协议栈)、驱动程序、文件系统、安全功能IPC:Inter Process Communication机制本地进程间通信机制:消息队列、semerphor、shm(共…

    2016-09-29
  • N25第二周视频作业:用户、组与权限管理详解

    此篇博客是根据视频要求写的,因为马哥在视频中说了,用户组、权限在linux运维过程中比较重要,所以一定要深入学习 首先,先介绍一下用户、组与权限是什么:     用户:用户时指你在服务器上的标识,通过不同类型的用户,你享受到不同的待遇,而待遇就是权限的大小。每个用户在服务器上都有唯一的id标识,即使你将此用户删除,再建…

    Linux干货 2016-11-26
  • 挂载

    挂载的相关介绍

    Linux干货 2017-12-10
  • 马哥教育网络班25期+第一周课程练习

    一、计算机的组成及功能     现代计算机的结构:冯诺依曼结构体系(储存程序,顺序执行),由20世纪30年代中期,美国科学家冯·诺依曼提出     冯.诺依曼结构处理器具有以下几个特点:     1:必须有一个存储器;2:必须有一个控制器;3:必须有一个运算器…

    Linux干货 2016-11-28
  • 网络配置详解(一)

    Linux网络属性配置      ifcfg命令家族:ifconfig, route, netstat      ifconfig命令:      ifconfig [INTERFACE]      # ifconfig -a 显示所有接口…

    Linux干货 2017-01-02