Linux四剑客与正则之sed命令

sed:常用来取行,过滤,替换修改文件内容;向后引用;
格式:
sed 选项 '条件动作/找谁干啥' 文件;
取出文件第3行
sed -n '3p' /etc/passwd //p就是输出,-n,取消默认输出
如何运行:
sed命令运行时候,一行一行读取,放到内存中,叫模式空间-内存(pattern space),然后看看第1行是不是我要的,不是放行,默认会把当前行输出屏幕,是,就执行对应命令,比如增删改查;

 

sed增删改查之查找
类似于grep命令的过滤,比grep强在于可以指定行号;
类似于grep命令的功能,过滤,模糊查询(通过正则);

案例1:
取出第2行到第5行
sed -n '2,5p' /etc/passwd

案例2:过滤出/etc/passwd中包含root的行;
sed -n '/root/p' /etc/passwd // //之间,可以写基础正则
sed -n '/^root/p' /etc/passwd //如果需要使用扩展正则,需要加-r选项
sed -n '// , //p' /etcpasswd //从哪里来,到哪里结束,模糊匹配,连续匹配
试着取出access.log中11:05到11:06的日志
sed -n '/11:05:00/,/11:06:00/p' access.log
只显示第2行,第5行
sed -n '2p;5p' /etc/passwd
从第1行开始,每2行取一下
[root@web01 ~]# seq 10 | sed -n '1~2p'

 

sed命令增删改查之修改:

sed的修改叫做替换。
案例01:把sed.txt文件中mclind替换为oldboy
sed 's#mclind#oldboy#g' sed.txt //'s#找谁#替换成谁#g' ,s,substitute,替换,g,global,全局替换,不加只替换一次;替换成谁,不写就是删除
sed 's#mclind##g' sed.txt
//注意,这样只是输出看起来修改了,默认是不改变文件的,加上-i选项,就是修改文件
sed -i 's#mclind##g' sed.txt
//-i后可以加内容,修改文件内容前备份,然后再修改
sed -i.bak 's#mclind##g' sed.txt
//如果有多个选项,-i这个放最后;
sed '3s#mclind#oldboy#g' sed.txt //只替换第3行

 替换:后向引用;

[root@web01 ~]# echo 123456 | sed -r 's#(.*)#<\1>#g'
<123456>
//解释,用引向引用,需要扩展正则小括号,所以需要加-r选项;
//匹配的内容,需要用小括号括起来,相当于分组了,后边可以引用;
//后边引用时,\1表示取出第1组内容;
[root@web01 ~]# echo 123456 | sed -r 's#(.)#<\1>#g'
<1><2><3><4><5><6>
应用说明:sed命令中处理列的方式;
使用格式:
使用替换形式 s###g
前2个#号之间通过正则+()进行分组,
在后面2个#号之间通过\数字,获取前面分组的内容,
整体是后面调用前面分组的内容,称之为反向引用/后向引用;
案例:调换/etc/passwd第1列和最后1列内容
cp /etc/passwd .
cat passwd
sed -r 's#(^.*)(:x.*:)(.*$)#\3\2\1#g' passwd

取出IP地址:
# ip a s eth0 //只看eth0的地址
# ip a s eth0 | sed -n '3p' | sed -r 's#(.*inet )(.*)(/.*)#\2#g'
# ip a s eth0 | sed -n '3p' | sed -r 's#^.*inet ([0-9.]+)/.*#\1#g' //老师给的答案
方法2:
# ip a s eth0 | sed -nr '3s#.*inet (.*)/.*#\1#gp'
方法3:
ip a s eth0 | sed -n '3p' | awk '{print $2}' | sed 's#/24##g'
方法4-6:
ip a s eth0 | sed -n '3p' | awk -F "[ /]+" '{print $3}'
ip a s eth0 | awk -F "[ /]+" 'NR==3{print $3}'
hostname -I

案例:
取出stat /etc/hosts中的0644
stat /etc/hosts | sed -nr '4s#^.*\(([0-7]{4})/.*$#\1#gp' 

删除整行;

d sed命令删除功能按行单位进行;
如果仅删除某一行中的内容,用s###g,为空替换就是删除
sed '3d' sed.txt
sed -i '3d' sed.txt //加上-i,就是真正的删除,会改写到文件
//删除空行和注释行
sed -r '/^$|#/d' sed.txt
//用awk找出空行和注释行
awk '/^$|#/' sed.txt
//其中!表示取反
awk '! /^$|#/' sed.txt

 

 

 

增删改查之增加

cai
a append ,在指定行后面追加内容;
i insert ,在指定行前面追加一行;
c replace ,替换指定行的内容

sed '3a 999,996,007,LIXN' sed.txt //在第3行后一行,添加内容
sed '3i 999,996,007,LIXN' sed.txt //在第3行前一行,添加内容
sed '3c 999,996,007,LIXN' sed.txt //第3行被替换为此内容

 

 

  

 

 

========================
========================
1、删除文件中每一行第一个字符
sed 's#^.##g' file_name
2、删除文件每行的第二个字符
sed -r 's#^(.).#\1#g' file_name
3、删除每行最后一个字符
sed 's#.$##g' file_name
4、删除每行倒数第二个字符
sed 's#.(.)$#\1#g' file_name
5、删除文件每行的第二个单词
sed -r 's#^([a-zA-Z]+)([^a-zA-Z]*)([a-zA-Z]+)#\1\2#g' file_name

posted @ 2022-12-19 11:20  mclind  阅读(654)  评论(0编辑  收藏  举报