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