sed 命令
sed是一种在线编辑器,一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
参数:
-n :只有经过sed 特殊处理的那一行(或者动作)才会被列出来
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内
-r :sed 的动作支持的是延伸型正规表示法的语法
-i :直接修改读取的文件内容,而不是输出到终端
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除,因为是删除啊,所以 d 后面通常不接任何内容
i :插入, i 的后面可以接字串,而这些字串会是新的一行
p :列印,将某个选择的数据输出
s :取代,直接进行取代,通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g
常用示例:
删除:d命令
$ sed ‘2d‘ filename-----删除filename文件的第二行。
$ sed ‘2,$d‘ filename-----删除filename文件的第二行到末尾所有行。
$ sed ‘$d‘ filename-----删除filename文件的最后一行。
$ sed ‘/test/‘d filename-----删除filename文件所有包含test的行。
替换:s命令
$ sed ‘s/test/mytest/g‘ filename-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
$ sed -n ‘s/^test/mytest/p‘ filename-----(-n)选项和p标志一起使用表示只输出那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就输出它。
$ sed ‘s/^192.168.0.1/&localhost/‘ filename-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
$ sed -n ‘s/\(love\)able/\1rs/p‘ filename-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被输出出来。
$ sed ‘s#10#100#g‘ filename-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
选定行的范围:逗号
$ sed -n ‘/test/,/check/p‘ filename-----所有在模板test和check所确定的范围内的行都输出
$ sed -n ‘5,/^test/p‘ filename-----从第五行开始到第一个包含以test开始行之间的所有行
$ sed ‘/test/,/check/s/$/sed test/‘ filename-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
$ sed -e ‘1,5d‘ -e ‘s/test/check/‘ filename-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
$ sed --expression=‘s/test/check/‘ --expression=‘/love/d‘ filename-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
从文件读入:r命令
$ sed ‘/test/r file‘ filename-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
写入文件:w命令
$ sed -n ‘/test/w file‘ filename-----在filename中所有包含test的行都被写入file里。
追加命令:a命令
$ sed ‘/^test/a\\--->this is a filename‘ filename<-----‘this is a filename‘被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
插入:i命令
$ sed ‘2i drink tea‘ filename -------在22行插入drink tea
sed -i ‘s/\.$/\!/g‘ regular_express.txt 利用 sed 将 regular_express.txt 内每一行结尾
sed提取日志
首先看一下日志的格式:
1016-12-17 09:25:55,606 [catalina-exec-74] INFO org.springframework.jdbc.datasource.JdbcTransactionObjectSupport - JDBC 3.0 Savepoint class is available
1016-12-17 09:25:55,658 [catalina-exec-74] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: null
1016-12-17 09:25:55,606 [catalina-exec-74] INFO org.springframework.jdbc.datasource.JdbcTransactionObjectSupport - JDBC 3.0 Savepoint class is available1016-12-17 09:25:55,658 [catalina-exec-74] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: null
根据日志格式,需要将12-17的09:25:55 和09:28:08 之间的日志截取出来。
使用sed命令如下:
sed -n ‘/2016-12-17 09:25:55/,/2016-12-17 09:28:08/p’ logfile
这样可以精确地截取出来某个时间段的日志。
也可以用下面命令
sed -n ‘/2016-12-17 09:[0-9][0-9]:[0-9][0-9]/,/2016-12-17 16:[0-9][0-9]:[0-9][0-9]/p’ logfile
来源: