grep:适用于找文本内容
sed:适用于大量修改。属于行编辑器。支持标准输入。是一行行的取到内存中处理。
格式:sed [参数] ‘地址命令’ 文件 (可以只有命令,但不能只有地址)
一、参数
-n 使默认输出不显示
-i.后缀 真正的修改了文件。加后缀为了给原来的文件一个备份
-r 支持扩展正则表达式
二、地址
①、不给为空,默认为全文处理
②、单地址:
#:指定的行。 $:最后一行
/正则表达式/
③、范围地址:
#,#:几到几行
#,+#:从几到几行及以后的行
/正则/,/正则/:从第一个正则开始,到第二个。若第二个未出现,则一直到结尾
#,/正则/
④、步进:
奇数行:1~2 从第一行开始,每次加2行
偶数行:2~2 从第二行开始,每次加2行
三、命令
p 使结果显示
d 将选中的行删除不显示,其他行显示(不是真的删除) sed '1d;4d' a.txt
a []text 在后一行追加 (注:可多个添加)a text 在下一行不顶头添加 a text1 text2 连续加两行
i []text 在上一行追加
c []text 将本行替换
w /path/file 将找到的写入file中
r /path/file 将file内容写入匹配的行的下面
= 显示匹配的行号
! 取反(给地址,不算命令)
s///(g) 例如:sed -nr 's/(r..t)/1er/gp' /data/passwd
ifconfig |sed -n '2s/^.*inet//;s/ net.*//p'
ifconfig |sed -n '2s/(.*inet)([0-9].*)( netmask.*)/2/p'
sed -nr '^#!s/^/#/p' 文件名
echo /etc/sysconfig |sed -nr 's/(.*)/([^/]+)/?/2/p'
echo /etc/sysconfig/ |sed -nr 's/(.*)/([^/]+)/?/1/p'
注意sed中使用变量:①、“$n”
②、' '''$n''' '
修改网卡名为:①、sed -ir '/^GRUB_CMDLINE_LINUX=/s/(.*)"$/1 net.ifnames=0"/' /etc/default/grub
或 sed -ir '/^GRUB_CMDLINE_LINUX=/s/"$/ net.ifnames=0"/' etc/default/grub
②、Centos7、8: grub2-mkconfig -o /boot/grub2/grub.cfg
Ubuntu: grub-mkconfig -o /boot/grub/grub.cfg
④、sed的高级用法:
sed除了支持空间模式(pattern space),还支持保持空间(Hold space),它只负责暂时保留,不参与sed运算
h 把pattern内容覆盖到hold空间
H 把pattern内容追加到hold空间
g 把hold内容覆盖到pattern空间
G 把hold内容追加到pattern空间
d 删除pattern空间的行
将第三行推到第九行:sed '3h,9G'
sed '3h,9G;9!d'