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: 打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
sed 'n;p' passwd
1,2,3,4行,当匹配到第一行时下一行为2,第二行覆盖第一行并打印
2,第三行读取下一行覆盖第三行,打印第四行,
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
-------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------- 博客均为个人笔记,无所追求,仅供参考~~~ QQ--2382990774