Sed 的常用方法

Sed:

 演示文件: passwd

 

 -n  关闭自动打印     开头 ^  空行 ^$  结尾或最后一行$

p 打印

1 sed 'p' passwd 默认自动打印,p重复操作
2 sed -n 'p' passwd 自动打印不做,p继续打印
3 sed -n '2p' passwd  关闭自动打印,只打第2行
4 sed -n '2p' 默认键盘会等着输入,输入的东西只打印第2 行

  挑选出IP地址第二行

1 ifconfig ens33 |sed -n '2p'

 列出1~10 并挑选出最后一行

1 seq 10 |sed -n '$p'
2 seq 10 |tail -n1

 挑选出包含*的行

1 ifconfig ens33 |sed -n '/netmask/p' 挑选出包含netmask 的行
2 sed -n '/^2/p' passwd 挑选包含2开头的行

  显示2~4行

1 sed -n '2,4p' passwd

 显示1开头的到3开头的信息(数字可以更改为字母)

sed -n '/^1/,/^3/p' passwd

  sed -n '/^r/,/^p/p' /etc/passwd

挑选出日志文件中,几点几分到几点几分的日志行(如需要另存可使用重定向 > >>)

sed -n '/^Jul 17 12:30:01/,/^Jul 17 13:40:01/p' /var/log/messages

第1行开始到1+3行打印

sed -n '1,+3p' passwd

打印第一行开始,每隔两行显示,~步进

sed -n '1~2p' passwd

d 删除

seq 10 |sed  '1~2d'        删除1开始每隔两个删除
ss -nt  |sed  '1d'         删除第一行
sed  '/^#/d' /etc/fstab    删除#开头的行删除
cat /etc/fstab |sed  '/^#/d'|sed '/^$/d'    删除#号开头的行和空开头的行
sed '/^#/d;/^$/d' /etc/fstab  删除#号开头的行和空开头的行

a      追加 符合条件的行后面追加

c   追加 符合条件的行前追加

i    直接修改文件

i.bak  先备份原文件在修改文件(bak为后缀,后缀随便什么)

替换SELINUX=这行为 SELINUX=enforcing

sed -i '/^SELINUX=/c SELINUX=enforcing ' /etc/selinux/config 
sed -i '/^SELINUX=/c SELINUX=disable' /etc/selinux/config 替换为disable
从第一行起没隔3行追加 base(直接修改原文件)
sed -i.bag '1~3a base' passwd
最后一行添加别名 vi=vim 
sed -i '$a alias vi=''vim''' /root/.bashrc
在root 行开头追加一行
sed -i '/^root/a test ' passwd 
在listen 80后面添加8080
sed -i '/^Listen 80/a Listen 8080 ' /etc/httpd/conf/httpd.conf

 w /path/file 保存模式匹配的行至指定文件

sed '/^#/d;w /data/f1' /etc/httpd/conf/httpd.con 挑选出#号开头的,并另存为/data/f1
r /path/file 读取指定文件的文本至模式空间中匹配到的行后
seq 3 |sed '2~2r /etc/issue'  在2 行面添加etc/issue
= 为模式空间中的行打印行号
sed -n '/root/=' /etc/passwd 符合的行,的行号打印
! 模式空间中匹配行取反处理

seq 10 |sed -n '1~2!p' 取反
s/// 查找替换,支持使用其它分隔符,s@@@,s###

搜索替代 ,第一个斜杠和第二个之间放的要搜索的东西,第二个和第三个之间放的要替代的东西
替换标记:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
全局搜索root 替换成ROOT
sed  's/root/ROOT/g' /etc/passwd 
sed -n 's/root/ROOT/gp' /etc/passwd
搜索第二行全局替换任意字符开头到inet 替换为空 搜索空格到netmask后面全部,替换为空
ifconfig ens33 |sed -n '2s/^.*inet //;s/ netmask.*//p'
-e 多点编辑
ifconfig ens33 |sed -n 2p |sed -e 's/^.*inet //' -e 's/ netmask.*//' 加-e 多个命令执行,和;没区别
ifconfig ens33 |sed -nr '2s/(^[^0-9]+)([0-9.]+)( .*$)/2/p'
使用扩展正则表达式加r ,第二行 ,全局搜索
匹配,非数字开头的多个    数字和点,多个    最后空格点* 分成组 留下第二个组打印
ifconfig ens33 |sed -nr '2s/^[^0-9]+([0-9.]+).*$/1/p' 分组分成一个组,直接挑选第一个组
挑选出文件夹名 
echo /etc/sysconfig/network-scripts/|sed -r 's@(^/.*/)([^/]+)/?$@2@'
's@@@'搜索
(^/.*/ )行首到/
([^/]+/)?$   非/最后/ 可能有可能没有?$可能有可能没有
2 取2
1 取1
sed -rn '/^[[:space:]]+linux16/s#(.*)#1 net.ifnames=0#p' grub.cfg
'/^[[:space:]]+linux16     空格开头的,不确定几个空格+,linux16 
s###p 搜索打印
(.*) 任意字符
1 net.ifnames=0  前面第一个分组,任意字符的意思,加net.ifnames=0
sed -rn '/^[[:space:]]+linux16/s#.*#& net.ifnames=0#p' grub.cfg
&表示前面搜索出来的东西
在原本中间插入字:
sed -nr '/^GRUB_CM/s@(.*)(")@1 net.ifnames=0"@p' /etc/default/grub
sed -r '/GRUB_CMDLINE_LINUX/s@"$@ net.ifname=0"@' grub
搜索变量替换:单引号变量不起作用,替换双引号,或者把变量放到三对单引号之间sed 自己的用法:
var=root
sed "s@$var@wang@" /etc/passwd
sed  's@'''$var'''@wang@' /etc/passwd

高级编辑命令

P: 打印模式空间开端至 内容,并追加到默认输出之前

h: 把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
sed 'n;p' passwd
1,2,3,4行,当匹配到第一行时下一行为2,第二行覆盖第一行并打印
2,第三行读取下一行覆盖第三行,打印第四行,
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

原文地址:https://www.cnblogs.com/alexlv/p/13329477.html