Welcome 微信登录

首页 / 操作系统 / Linux / Linux命令之sed命令使用介绍

sed是linux轻量级流编辑器,用于行的操作,主要用来数据的选取、替换、删除、新增等。从输入文件中一次一行的读取,
按顺序将列表中的命令应用到每一行,并将其编辑过的行,写到标准输出。
权  限:所有用户
位  置:/bin/sed
用  法:sed [-nefr]  [动作]  file
参数:
-n
         不加-n的时候,sed处理的数据和不处理的都会输出,加上-n只会输出sed操作的行,
         注意:与动作p和起来用,不要与其他动作一起用
-e
         直接在命令行模式上进行sed的动作编辑
         例如:sed -e "s/aaa/b/g; s/aa/b/g" file 也即多个动作同时操作,注意中间的分号
-f          
         直接将sed动作写在一个文件内,-f file 则可以执行filename内的sed动作
-r
         sed的动作支持扩展的正则表达式(默认支持基础正则表达式)
-i
         直接修改读取的文件内容
注意:多个选项参数一起用的时候,例如:sed  -i  -r  ...             不可以这样:sed -ir  ...
动作说明:[n1[,n2]] function
         不见得会存在,一般代表选择动作的行数,如果动作是在5到15行之间进行替换,则"10,20c"
a      新增,当前行的下一行
         sed "2a hello world" file  输出在第2行之后插入hello world


         sed "2a hello world      
         my name is csdn"  file      
        输出在2行下面插入两行分别为hello world  和my name is scdn
         特别注意hello world 后面的""
c       替换,是整行替换
         sed "3,6c  hello csdn"  file  
         输出把3至6行的只替换为 hello csdn(第3至6行只剩下一行hello csdn,不是3至6行的每一行都为hello csdn)
d       删除
          sed "3,6d" file  输出删除file的3至6行之后的内容
i        插入,当前行的上一行
          与a动作类似,参照a动作用法
p       打印
          sed  -n  "2,5p" file   打印file的第2至5行
s        替换
          sed "s/oldString/newString/g" file   oldString和newString支持基础正则表达式和扩展的正则表达式
          cat -n nginx | sed "1,99s/[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}//g"  把nginx日志的1至99行的第一个字段IP地址替换为空
          结果为:
91 - - [15/Dec/2014:23:00:10 +0800],GET /identified?key=this-is-TMP-apikey&digest=914EBB2FD551844CBE15513C0126E6EE&digest-algorithm=ed2k&hash=9D37BB2988F26973371FAB028FEEEB93D5542300& HTTP/1.1,200 65,-,XMP Windows Client 4.9,-,ed2k://|file|ki141213.wmv|1119747351|914EBB2FD551844CBE15513C0126E6EE|h,00E04C377725NG4E,ki141213.wmv,111974735192 - - [15/Dec/2014:23:00:10 +0800],GET /identified? HTTP/1.1,401 112,-,-,-,-,-,-,-93 - - [15/Dec/2014:23:00:10 +0800],GET /identified? HTTP/1.1,401 112,-,-,-,-,-,-,-94 - - [15/Dec/2014:23:00:10 +0800],GET /identified? HTTP/1.1,401 112,-,-,-,-,-,-,-95 - - [15/Dec/2014:23:00:10 +0800],-,400 0,-,-,-,-,-,-,-96 - - [15/Dec/2014:23:00:10 +0800],GET /identified?key=this-is-TMP-apikey&digest=76BB7C854168DCD1BF15FCB92E4114FFD4CFE7DE&digest-algorithm=magnet&hash=28003498535& HTTP/1.1,200 65,-,Thunder Windows Client 7.9,-,magnet:?xt=urn:btih:76BB7C854168DCD1BF15FCB92E4114FFD4CFE7DE,EC55F9E92A5212LQ,ABP-209R,106717882697 - - [15/Dec/2014:23:00:10 +0800],GET /identified? HTTP/1.1,401 112,-,-,-,-,-,-,-98 - - [15/Dec/2014:23:00:10 +0800],GET /identified? HTTP/1.1,401 112,-,-,-,-,-,-,-99 - - [15/Dec/2014:23:00:10 +0800],-,400 0,-,-,-,-,-,-,- 100121.12.57.154 - - [15/Dec/2014:23:00:10 +0800],GET /identified? HTTP/1.1,401 112,-,-,-,-,-,-,-


动作其他用法1:sed  "/模式/动作"  文件
可以指定某种模式的行进行动作操作,如下(这里的文件名是a,注意cat a的输出):
1、以p开头的行前加[TAB]

$ cat apa:11:asa:32:capp:5:bstort:1:dpear:4:aahello:3:f$ sed "/^p/s/^/	/" apa:11:asa:32:capp:5:bstort:1:dpear:4:aahello:3:f

2、删除以a开头的行,(那么下面的输出,以a开头的行就没了)

$ sed "/^a/d" apa:11:asa:32:cstort:1:dpear:4:aahello:3:f
3、反向匹配(文件a中,输出只保留了a开头的行)
$ sed "/^a/!d" aapp:5:b

4、等价与grep -v   (输出文件a中,非p字母开头的行)

$ grep-v "^h" apa:11:asa:32:capp:5:bstort:1:dpear:4:aa$ sed -n "/^h/!p" apa:11:asa:32:capp:5:bstort:1:dpear:4:aa


动作其他用法2:
也可以使用成对的正则表达式或行号与正则表达式的结合,来选取一定范围的行,如下:
1、sed "1,3d"  file   删除1至3行
2、sed -n "1,3p" file  打印1至3行
3、sed  "1, /^$/d" file  删除范围:第一行至第一个空行 (注意格式)
4、sed "/^$/, /^app/d" file  删除范围:第一个空行至以app开头的行
5、sed "$d"  file   删除最后一行

注意:反向匹配行,是动作前加感叹号 (!d    !s    !c等等)

如果前面的命令直接加入-i,则直接修改文件