处理文本的工具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/passwd中root开头的行
[root@localhost ~]#sed -n '/^root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash
打印出/etc/passwd中的10到20行
[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