sed命令行编辑器详述
sed命令:
将指定的文本文件内容逐行读取至sed的临时内存空间当中,成为"模式空间",然后逐行查看是否被sed的地址定界所匹配到,如果匹配则执行相应的编辑命令,否则,默认将模式空间中的内容输出至标准输出
sed [OPTION]... 'script' [input-file]...
script:地址定界编辑命令
常用选项:
-n:静默模式,不输出模式空间中的内容至标准输出
-e:定义多个sed script
-f /PATH/TO/SED_SCRIPT_FILE
每行一个编辑命令
-r:启用扩展正则表达式
-i:直接编辑原文件
sed -i.bak 'script' FILE:在编辑原文件之前先备份原文件为FILE.bak
地址定界:
(1)空地址:对全文进行处理
(2)单地址:
#:指定行
/pattern/:被此模式所匹配到的每一行
(3)地址范围:
#,#:起始到结束
#,+#:指定的行开始向后加#行
#,/pat1/
/pat1/,/pat2/
(4)步进:~
1~2:所有奇数行
2~2:所有偶数行
编辑命令:
d:删除模式空间中的内容
p:显示被模式所匹配到的内容
a \string:在指定的行后面添加新行,内容为string
\n:换行
i \string:在指定的行前面追加新行,内容为string
\n:换行
c \string:把匹配到的行替换为string
w /PATH/TO/SOMEFILE:将匹配到的行的内容保存至指定文件中
r /PATH/FROM/SOMEFILE:将指定文件中的内容追加至所匹配到的行后面
=:为模式匹配到的行打印行号
!:条件取反
地址定界!编辑命令
s/PATTERN/STRING/修饰符:查找并替换,其分隔符可自定义,例如s@@@,s###等等
PATTERN:可使用正则表达式的模式进行查找匹配
STRING:使用字符串定义替换的内容,可使用后向引用\1,\2,…
&:引用前面PATTERN所匹配到的所有内容
修饰符:
p:显示替换成功的内容
w /PATH/TO/SOMFILE:将替换成功的内容保存至指定文件当中
i:查找替换时忽略大小写
g:全局替换,默认只替换每行第一个被PATTERN所匹配到的内容
练习:
1.删除/boot/grub2/grub.cfg文件中所有以空白字符开头的行的行首的所有空白字符
[root@CentOS7 ~]
# cat /boot/grub2/grub.cfg | sed -r 's@^[[:space:]]+@@'
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
set
pager=1
if
[ -s $prefix
/grubenv
];
then
load_env
fi
if
[
"${next_entry}"
] ;
then
set
default=
"${next_entry}"
set
next_entry=
save_env next_entry
set
boot_once=
true
else
set
default=
"${saved_entry}"
fi
if
[ x
"${feature_menuentry_id}"
= xy ];
then
menuentry_id_option=
"--id"
else
menuentry_id_option=
""
fi
export
menuentry_id_option
if
[
"${prev_saved_entry}"
];
then
set
saved_entry=
"${prev_saved_entry}"
save_env saved_entry
set
prev_saved_entry=
save_env prev_saved_entry
set
boot_once=
true
fi
2.删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符
[root@CentOS7 ~]
# cat /etc/fstab | sed -r 's@^#[[:space:]]+@@'
This is one line.
This is two line.
This is three line.
#
/etc/fstab
Created by anaconda on Thu Jul 21 12:06:23 2016
#
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=89ec9224-65c7-4461-9350-9d5e016d016c / xfs defaults 0 0
UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39
/boot
xfs defaults 0 0
UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1
/testdir
xfs defaults 0 0
UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap swap defaults 0 0
[root@CentOS7 ~]
#
3.在/root/install.log每一行行首增加#号
[root@CentOS6 ~]
# sed -r 's@^@#@' install.log
#Installing zip-3.0-1.el6_7.1.x86_64
#Installing rfkill-0.3-4.el6.x86_64
#Installing rdate-1.4-16.el6.x86_64
#Installing bridge-utils-1.2-10.el6.x86_64
#Installing b43-fwcutter-012-2.2.el6.x86_64
#Installing latrace-0.5.9-2.el6.x86_64
#Installing trace-cmd-2.2.4-3.el6.x86_64
#Installing crash-trace-command-1.0-5.el6.x86_64
#Installing m17n-db-thai-1.5.5-1.1.el6.noarch
#Installing scenery-backgrounds-6.0.0-1.el6.noarch
#Installing gnome-backgrounds-2.28.0-2.el6.noarch
#Installing ql2400-firmware-7.03.00-1.el6_5.noarch
#Installing iwl5000-firmware-8.83.5.1_1-1.el6_1.1.noarch
#Installing ql2100-firmware-1.19.38-3.1.el6.noarch
#Installing ivtv-firmware-20080701-20.2.noarch
#Installing libertas-usb8388-firmware-5.110.22.p23-3.1.el6.noarch
#Installing xorg-x11-drv-ati-firmware-7.6.1-2.el6.noarch
4.在/etc/fstab文件中不以#开头的行的行首增加#号
[root@CentOS6 ~]
# sed -r 's@^[^#]@#&@' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Jul 21 15:34:03 2016
#
# 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=f4d977bb-af76-4617-b07f-9c70ae42a056 / ext4 defaults 1 1
#UUID=7907abdd-41cd-4609-8392-80e4a88c5b4c /boot ext4 defaults 1 2
#UUID=50054489-14c8-4e49-a912-2ff368371653 /testdir ext4 defaults 1 2
#UUID=d9f41da6-9df2-410f-8074-500425b26a3d 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
[root@CentOS6 ~]
#
5.处理/etc/fstab路径,使用sed命令取出其目录名和基名
[root@CentOS6 ~]
# echo /etc/sysconfig/network-scripts/ | sed 's@^\(.*\/\)\([^/]\+\/\?\)@\1@' #取出目录名
/etc/sysconfig/
[root@CentOS6 ~]
# echo /etc/sysconfig/network-scripts/ | sed 's@^\(.*\/\)\([^/]\+\/\?\)@\2@' #取出基名
network-scripts/
[root@CentOS6 ~]
#
6.利用sed 取出ifconfig命令中本机的IPv4地址
[root@CentOS7 ~]
# ifconfig | sed -n '/\<inet\>/p' | sed -r 's@inet (([[:digit:]]+\.){3}[[:digit:]]+).*@\1@'
10.1.253.23
127.0.0.1
192.168.122.1
[root@CentOS7 ~]
#
7.统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
[root@CentOS7 Packages]
# df -lh #查看光盘是否挂载
Filesystem Size Used Avail Use% Mounted on
/dev/sda2
50G 4.1G 46G 9% /
devtmpfs 475M 0 475M 0%
/dev
tmpfs 489M 84K 489M 1%
/dev/shm
tmpfs 489M 7.1M 482M 2%
/run
tmpfs 489M 0 489M 0%
/sys/fs/cgroup
/dev/sda5
20G 61M 20G 1%
/testdir
/dev/sda1
197M 139M 59M 71%
/boot
tmpfs 98M 20K 98M 1%
/run/user/42
tmpfs 98M 0 98M 0%
/run/user/0
/dev/sr0
7.3G 7.3G 0 100%
/media/cdrom
[root@CentOS7 Packages]
# ls | sed -r 's@.*\.([^.]+)\.rpm$@\1@' | sort | uniq -c #取出倒数第二个字段的重复次数
2000 i686
2938 noarch
1 TRANS.TBL
4069 x86_64
[root@CentOS7 Packages]
#
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:把保持空间中的内容覆盖至模式空间中
G:把保持空间中的内容追加至模式空间中
x:把模式空间中的内容与保持空间中的内容互换
n:覆盖读取匹配到的行的下一行至模式空间中
N:追加读取匹配到的行的下一行至模式空间中
d:删除模式空间中的行
D:删除多行模式空间中的所有行
示例:
1.显示文件偶数行
[root@CentOS7 Packages]
# sed -n 'n;p' /etc/fstab
# This is two line.
#
# Created by anaconda on Thu Jul 21 12:06:23 2016
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39
/boot
xfs defaults 0 0
UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap swap defaults 0 0
[root@CentOS7 Packages]
#
2.文件逆序显示
[root@CentOS7 Packages]
# sed '1!G;h;$!d' /etc/fstab
UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap swap defaults 0 0
UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1
/testdir
xfs defaults 0 0
UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39
/boot
xfs defaults 0 0
UUID=89ec9224-65c7-4461-9350-9d5e016d016c / xfs defaults 0 0
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
# Created by anaconda on Thu Jul 21 12:06:23 2016
# /etc/fstab
#
# This is three line.
# This is two line.
# This is one line.
[root@CentOS7 Packages]
#
3.显示文件的最后两行内容
[root@CentOS7 Packages]
# nl /etc/fstab | sed '$!N;$!D'
13UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1
/testdir
xfs defaults 0 0
14UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap swap defaults 0 0
[root@CentOS7 Packages]
#
4.将文件的空白行删除,并且在每行后面添加空白行
[root@CentOS7 ~]
# sed '/^$/d;G' /etc/fstab
# This is one line.
# This is two line.
# This is three line.
#
# /etc/fstab
# Created by anaconda on Thu Jul 21 12:06:23 2016
#
# 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=89ec9224-65c7-4461-9350-9d5e016d016c / xfs defaults 0 0
UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39
/boot
xfs defaults 0 0
UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1
/testdir
xfs defaults 0 0
UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap swap defaults 0 0
[root@CentOS7 ~]
#
5.显示奇数行
[root@CentOS7 ~]
# sed 'n;d' fstab
# This is one line.
# This is three line.
# /etc/fstab
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
UUID=89ec9224-65c7-4461-9350-9d5e016d016c / xfs defaults 0 0
UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1
/testdir
xfs defaults 0 0
[root@CentOS7 ~]
#