sed
用法:sed +选项+模式或范围+编辑命令(sed脚本)+文件路径
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本 -r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑
范围或模式
从/etc/passwd复制一份到当前文件夹,名为passwd文件为例 ,用cat命令配合管道看更直观 cat -n passwd |sed .....
-
表示最后一行 '$'
sed -n '$p' passwd
-
表示1行 '#'
sed -n '1p' passwd
-
表示1-5行 '#,#'
sed -n '1,5p' passwd
-
表示第1行向后5行 '#,+#'
sed -n '1,+5p' passwd
-
表示向后间隔2行 '#~#'
1)奇数行
sed -n '1~2p' passwd
2)偶数行
sed -n '2~2p' passwd
-
表示root开头到bin开头的行 '/pat1/,/pat2/'
sed -n '/^root/,/^bin/p' passwd
-
表示第三行到a开头的行 '#,/pat/'
sed -n '3,/\<a/p'
编辑命令
d: 删除模式空间匹配的行,并立即启用下一轮循环
例:删除1,40行
cat -n passwd |sed '1,40d'
——————
p:打印当前模式空间内容,追加到默认输出之后
例:删除1至40行并打印 (注意d;p之间用;因为代表两条命令,选项带n,表示关闭自动打印)
cat -n passwd |sed -n '1,40d;p'
——————
a \
:在指定行后面追加文本
例:在1至10行后添加666
cat -n passwd |sed '1,10a\ 666'
例:在1至10行后追加空行 (支持使用\n实现多行追加)
cat -n passwd |sed '1,10a\ \n'
——————
i \
:在行前面插入文本
例:在1至10行前添加999
cat -n passwd |sed '1,10a\ 999'
——————
c \
:替换行为单行或多行文本
例:把含有root单词的行全替换为 Blank_line
cat -n passwd |sed '/\<root\>/c\ Blank_line'
——————
w : 保存模式匹配的行至指定文件
例:把passwd文件中root开头的行直接写入到f111文件
sed '/^root/w f111' passwd
——————
r :读取指定文件的文本至模式空间中
例:把passwd文件中带root的行后都读一个/etc/issue内容在后面
sed '/root/r /etc/issue' passwd
——————
=: 为模式空间中的行打印行号
例:在含有root的行前面加上行号
sed '/root/=' passwd
——————
!: 模式空间中匹配行取反处理
例:除了第10行都打印
sed -n '10!p' passwd
s///:查找替换,也可用s@@@,s### (支持正则表达式)
替换标记
g:行内全局替换(不添加只替换找到的第一个)
p:显示替换成功的行
w:将替换成功的行保存至文件中
例:把passwd中root全部替换成ROOT并打印:
cat -n passwd |sed -n 's/root/ROOT/gp'
练习:
-
在文件/etc/default/grub中在GRUBCMDLINELINUX行尾"前添加 net.ifnames=0
sed -i.bak -r 's/(LINUX.*)"/\1 net.ifnames=0"/' /etc/default/grub
或 (用关键字替换)
sed -i.bak -r 's/(.*)"$/\1 net.ifnames=0"/' /etc/default/grub
或 (先用LINUX匹配行,之后用s//替换)
sed -i.bak -r '/LINUX/s/"$/net.ifnames=0"/' /etc/default/grub
-
用sed命令提取ip地址
Centos7
ifconfig ens37| sed -rn '2s/.*inet (.*) netmask.*/\1/p'
Centos6
ifconfig eth1 |sed -rn '2s/.*inet addr:(.*) Bcast.*/\1/p' ifconfig eth1 |sed -rn '2s/(.*inet addr:)(.*)( Bcast.*)/\2/p' ifconfig eth1 |sed -n '2p'|sed 's/^.*addr://'|sed 's/ Bcast.*//'
-
提取基名提取文件名
echo "etc/sysconfig/network-scripts" |sed -r 's#(^.*/)([^/]+/?$)#\2#'
-
去除某一个文件中前面的前面一段的#号
例:去掉passwd文件中gnome到tcpdump行前面的井号 思路:1,选定范围 2,查找替换sed '/^#gnome/,/^#tcpdump/s/#//' /data/passwd
-
没有井号的行添加#号 例:为/data/fstab文件中添加没有#号的行添加#号
sed -r 's/^([^#])/#\1/' /data/fstab sed 's/^[^#]/#&/' /data/fstab
(&代表s///中第1条和第2条斜线中的内容)
-
把/etc/fstab文件中内容大小写转换 \u大写 \l小写
cat /etc/fstab |sed -r 's/[[:alpha:]]/\u&/g' cat /etc/fstab |sed -r 's/[[:alpha:]]/\l&/g'
-
提取版本号
sed -r 's/[^[:digit:]]+([0-9]+).*/\1/' /etc/centos-release
-
为当前文件夹内文件添加一个随机数(有变量外边注意用双引号,或用三个单引把变量引起来)
ls |sed "s/.*/&_$RANDOM/" ls |sed 's/.*/&_'''$RANDOM'''/'
-
打印空行行号
sed -n '/^$/=' file1
-
删除井号开头和空行
sed '/^$/d;/^#/d' file1
sed高级编辑命令用法 (待完善)
P:打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环