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

相关推荐

  • linux中rpm命令的妙用

    linux中rpm命令的妙用 CentOS系统上使用rpm命令管理程序包: 安装、卸载、升级、查询、校验、数据库维护 安装:         rpm {-i|–install} [install-options] PACKAGE_FILE…    …

    Linux干货 2016-08-24
  • iptables的使用

    iptables         firewall:隔离工具;Packets Filter Firewall;工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一条组件; 硬件防火墙:在硬件级别实现部分顾虑功能;另…

    Linux干货 2016-10-29
  • 脚本编程部分_第十周练习

    Q1:写一个脚本: (1) 能接受四个参数:start, stop, restart, status;start: 输出“starting 脚本名 finished.”其余参数类似; (2) 其它任意参数,均报错退出; #!/bin/bash # read -p "The following choices&…

    Linux干货 2017-01-01
  • Linux 命令行返回状态

    linux 执行命令后会返回一个状态码 命令执行成功返回0: 当删除一个文件并删除成功时返回的状态码为0 [root@localhost 1]# rm -rf 1_1 [root@localhost 1]# echo $? 0 命令执行失败返回1-255 当把 文件夹 1_1 重命名为1_2失败后状态码为1 [root@localhost 1]# mv 1_…

    Linux干货 2017-08-28
  • Linux源程序包相关概念整理

    一、      Linux源程序包介绍 1)    linux源程序包基础 1.         遵循常用开源协议:BSD、Apache Licence 2.0、GPL、LGPL、MIT 2.&nbs…

    系统运维 2015-09-22
  • Linux文本处理工具

    知识框架图 学习笔记 查看文本 查看文本内容 cat -A:显示控制符 -E:显示行结束符$ -n:打印行号,显示空行 -b:打印行号,空行不编号 -s:压缩连续空白行 tac:反向查看文件内容 rev:文本每行倒序显示 分页查看 more less 查看文件头尾内容 head -c:前n个字节 -n:前n行 tail -c -n -f:跟踪显示文件变化,常…

    2018-03-17