删除:d命令
sed ‘2d’ 1.txt 删除1.txt文件中的第二行
sed ‘2,$d’ 1.txt 删除1.txt文件中的第二行到末尾所有行
sed ‘$d’ 1.txt 删除1.txt文件中的最后一行
sed ‘/123/d’ 1.txt 删除1.txt文件中含有123的行
替换:s命令
sed ’s/taiwu/song/g’ 1.txt 在整行范围内把taiwu替换为song,如果没有g标记,则只有每行第一个匹配的taiwu被替换成song。
sed -n ’s/^taiwu/^song/p’ 1.txt (-n)选项和p标志一起使用表示只打印那些发生替换的行。
sed ’s/^taiwu/&is my brother/’ 1.txt &符号表示替换字符串中被找到的部分,所有以taiwu开头的行都会被替换成它自己加is my brother。
sed ’s#10#100#g’ 1.txt 不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以’#’在这里是分隔符,代替默认的’/’分隔符。
sed ’s/\(love\)/able/'
选定行的范围:逗号
sed -n ‘/^abc/, /^456/p’ 1.txt
在1.txt文件中,截取一定范围的文本输出,从第一个匹配^abd和行开始,截止到第一个匹配^456的行。
sed -n ‘5, /apple/p’ 1.txt
在1.txt文件中,截取一定范围的文本输出,从第5行开始,截止到第一个匹配apple的行。
sed ‘/taiwu/, /song/s/apple/banana/‘ 1.txt
在1.txt文件中,把第一个含义taiwu的行到第一个含有song的行之间的文本拎出来,对其中的apple替换为banana。
sed使用场景:
1.从数据库general log中,取出某一天的日志,单独拎出来做分析。下面shell表示截取日期160905当天的所有日志,存到mylog文件中。
sed -n '/^160905/,/$/p' VM_206_197_centos.log > mylog
如上方式存在严重的问题,它只会把含有160905开头的行导出来,但是如果这行下面行还有数据,但是不是以160905开头就导不出来。最正确的方式是 sed -n ‘/^160905/, /^160906/p’ log > mylog
2.从yii2项目中截取含有某订单信息的所有的行,从而分析某订单的数据。
根据order_id,筛选出相关的行
sed -n 's/30780/&/p' app.log.1 > 2222
根据order_sn,筛选出相关的行
sed -n 's/BJ14732324231038/&/p' app.log.1 > 22
怎么匹配上面两个,正则怎么写???
3.从日志文件中截取某一天的日志,实际最后一行也都是14号的日志,还没有15号的。
如下命令,会把文件中所有14号的日志截取出来,找不到15号,那也会读到最后一行。
sed -n '/^2016-09-14/,/^2016-09-15/p' app.log.3 > 222
sed ‘2d’ 1.txt 删除1.txt文件中的第二行
sed ‘2,$d’ 1.txt 删除1.txt文件中的第二行到末尾所有行
sed ‘$d’ 1.txt 删除1.txt文件中的最后一行
sed ‘/123/d’ 1.txt 删除1.txt文件中含有123的行
替换:s命令
sed ’s/taiwu/song/g’ 1.txt 在整行范围内把taiwu替换为song,如果没有g标记,则只有每行第一个匹配的taiwu被替换成song。
sed -n ’s/^taiwu/^song/p’ 1.txt (-n)选项和p标志一起使用表示只打印那些发生替换的行。
sed ’s/^taiwu/&is my brother/’ 1.txt &符号表示替换字符串中被找到的部分,所有以taiwu开头的行都会被替换成它自己加is my brother。
sed ’s#10#100#g’ 1.txt 不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以’#’在这里是分隔符,代替默认的’/’分隔符。
sed ’s/\(love\)/able/'
选定行的范围:逗号
sed -n ‘/^abc/, /^456/p’ 1.txt
在1.txt文件中,截取一定范围的文本输出,从第一个匹配^abd和行开始,截止到第一个匹配^456的行。
sed -n ‘5, /apple/p’ 1.txt
在1.txt文件中,截取一定范围的文本输出,从第5行开始,截止到第一个匹配apple的行。
sed ‘/taiwu/, /song/s/apple/banana/‘ 1.txt
在1.txt文件中,把第一个含义taiwu的行到第一个含有song的行之间的文本拎出来,对其中的apple替换为banana。
sed使用场景:
1.从数据库general log中,取出某一天的日志,单独拎出来做分析。下面shell表示截取日期160905当天的所有日志,存到mylog文件中。
sed -n '/^160905/,/$/p' VM_206_197_centos.log > mylog
如上方式存在严重的问题,它只会把含有160905开头的行导出来,但是如果这行下面行还有数据,但是不是以160905开头就导不出来。最正确的方式是 sed -n ‘/^160905/, /^160906/p’ log > mylog
2.从yii2项目中截取含有某订单信息的所有的行,从而分析某订单的数据。
根据order_id,筛选出相关的行
sed -n 's/30780/&/p' app.log.1 > 2222
根据order_sn,筛选出相关的行
sed -n 's/BJ14732324231038/&/p' app.log.1 > 22
怎么匹配上面两个,正则怎么写???
3.从日志文件中截取某一天的日志,实际最后一行也都是14号的日志,还没有15号的。
如下命令,会把文件中所有14号的日志截取出来,找不到15号,那也会读到最后一行。
sed -n '/^2016-09-14/,/^2016-09-15/p' app.log.3 > 222