Linux三剑客-sed
1、四剑客对比
四剑客 | 特点 | 擅长 |
---|---|---|
find | 查找文件 | 查找文件,与其他命令配合 |
grep/egrep | 过滤 | 过滤速度最快 |
sed | 过滤,取行,替换,删除 | 替换,修改文件内容,取行 |
awk | 过滤,取行,取列,统计计算,判断,循环 | 取列,取行,统计计算 |
2、命令格式图解
sed 选项 条件/动作 /etc/passwd
条件 找谁
动作 干啥
3、常见的参数选项及说明
选项 | 说明 |
---|---|
-n | 取消默认输出,与内置命令p常用 sed命令会一行一行读,默认会都输出到屏幕上 |
-r | sed支持扩展正则 |
-i | 修改文件内容,这个选项放在最后 |
-i.bak | 先进行备份,然后修改文件内容.这个选项放在最后 |
-e | 允许多次编辑 |
4、常见的内置命令及说明
内置符 | 说明 |
---|---|
a append | 在指定行后面追加文本 |
c replace | 替换执行的内容 |
i insert | 在指定行上面插入文本 |
d delete | 删除匹配到的行 |
p print | 打印匹配到内容的行,常与-n一起使用 |
5、查找取行案例
增删改查之查找
5.1 取出文件的第三行
sed -n '3p' /etc/passwd
5.2 取出文件的第2行到第5行
sed -n '2,5p' /etc/passwd
5.3 过滤出包含root的行
sed -n '/root/p' /etc/passwd
sed进行过滤的时候需要使用 并且里面支持基础正则
如果需要使用扩展正则需要使用sed -r选项
5.4 过滤出不包含root的行
sed -n '/root/!p' /etc/passwd
or
sed '/root/d' /etc/passwd
5.5 过滤从104开始到105的行
sed -n '/104/,/105/p' sed.txt
5.6 只显示第三行和第五行
sed -n '3p;5p' sed.txt
5.7 有规律的查找
seq 10|sed -n '1~2p' #隔行显示
seq 10|sed -n '2~2p' #从第二行开始
将d改成p可删除
6、替换案例
sed的修改叫做替换
sed替换格式
sed ‘#找谁#替换成什么#’ 文件 分隔符推荐是用@ # /
s substitute 替换 sub
g global 全局替换,这一行中把所有匹配到的内容都进行替换,否则只替换每一行第1个匹配的内容
6.1 把lidao替换为oldboy
sed 's#lidao#oldboy#g' sed.txt
添加-i参数直接替换文件内容
使用-i.bak 可在替换前进行备份
6.2 将oldboy替换为oldgirl并且把lidao改为li
sed -e 's#oldboy#oldgirl#g' -e 's#lidao#li#g' sed.txt
7、替换案例-进阶
后向引用
后向引用或反向引用: 适用于sed命令处理/提取一行中的某一部分.sed命令配合正则实现取列.(类似于awk取列)
使用格式:
使用替换的形式 s###g
前2个井号之间通过正则与(),对数据进行分组
后面2个井号之间通过\数字,去调用前面分组的内容
整体是后面调用前面分组的内容,称之为反向引用/后向引用
应用场景: 某一行中对部分数据进行加工与处理,提取某一部分数据
7.1 配合正则给部分内容加<>
echo 12345678|sed -r 's#(1)(.*)(8)#\1<\2>\3#g'
7.2 调换/etc/passwd第1列和最后一列内容
sed -r 's#([a-z]+)(:.*:)(.*)#\3 \1#g' /etc/passwd
or
sed -r 's#^(.*)(:x.*:)(.*)$#\3 \1#g' /etc/passwd
7.3 取出ip地址
ip a s eth0|sed -nr '3 s#^([ a-z]+) ([0-9.]+)(/.*)#\2#g p'
or
hostname -I #输出结果后面有空格
7.4 取出stat /etc/hosts中的0644
stat /etc/hosts|sed -nr '4 s#^([a-Z:]+ \()([0-9]+)(/.*)$#\2#g p'
or
stat /etc/hosts|sed -nr '4 s#^(.*\()([0-9]+)(/.*)$#\2#g p'
8、删除案例
参考5.4
9、增加案例
a append 在指定行后面追加内容
i insert 在指定行上面插入一行
c replace 替换指定行的内容
9.1 在第一行下面追加两行666
sed -r '1a 666\n666' sed.txt
9.2 在包含oldboy和lidao的行下面追加两行666
sed -r '/oldboy|lidao/a 666\n666' sed.txt
i和c案例直接将a替换即可