shell 正则表达三剑客--sed

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

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替换。  

多点编辑:e命令  

$ 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 














本文转自super李导51CTO博客,原文链接: http://blog.51cto.com/superleedo/1887915,如需转载请自行联系原作者


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
9月前
|
存储 Shell Perl
shell脚本三剑客之sed
shell脚本三剑客之sed
55 2
|
3月前
|
Shell Linux Perl
Linux shell脚本sed使用
Linux shell脚本sed使用
31 1
|
4月前
|
机器学习/深度学习 Shell Perl
第七章 Shell文本处理三剑客之sed
第七章 Shell文本处理三剑客之sed
|
4月前
|
Shell Perl
shell学习(九) 【shell sed用法】
shell学习(九) 【shell sed用法】
48 0
|
4月前
|
存储 Shell Linux
⭐⭐⭐【Shell 命令集合 文档编辑 】Linux 文件内容处理 sed命令使用指南
⭐⭐⭐【Shell 命令集合 文档编辑 】Linux 文件内容处理 sed命令使用指南
45 0
|
10月前
|
运维 Unix Shell
运维(19)-shell sed
运维(19)-shell sed
43 0
|
12月前
|
存储 Shell Perl
shell编程之sed编辑器
shell编程之sed编辑器
61 0
|
Unix Shell Linux
【Shell编程】字符截取命令awk、sed命令
【Shell编程】字符截取命令awk、sed命令
213 0
|
Unix Shell Linux
两个实用的shell命令:sed和awk用法
两个实用的shell命令:sed和awk用法
115 0
|
移动开发 Shell Linux
shell学习第七天之Linux三剑客grep,sed,awk
shell学习第七天之Linux三剑客grep,sed,awk
107 0