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,则直接修改文件