聊聊Sed常用操作盘点

系统 Linux
匹配到第一个和最后一个的全部打印出来,所以要取9点到10点的日志要打印到11点第一条就能确保9点到10点的都打出来了。直接写日期和正则的区别是一个精确匹配一个模糊匹配。

[[407937]]

本文转载自微信公众号「新钛云服」,作者秦鸣。转载本文请联系新钛云服公众号。

本文详细介绍sed -n参数、-I参数、-e参数的使用,并用例子进行说明。内容提要:

-n参数

  • 实例:选取一段时间的日志

......

-i参数

  • 实例:删除第一行
  • 实例:删除2-5行
  • 实例:删除每行最后两个字符
  • 实例:删除每行前两个字符
  • 实例:删除行首的空格
  • 实例;删除空行
  • 第一行上添加一行内容
  • 替换内容

......

-e参数

  • -e与不加-e的区别
  • 常用实例sed获取ip

......

-n参数

只打印模式匹配的行。

实例:选取一段时间的日志

  • 日期在日志中间的例子
  1. # sed -n '/2019-07-23 09:[0-9][0-9]:[0-9][0-9]/,/2019-07-23 11:[0-9][0-9]:[0-9][0-9]/p' 20190723_teacher.log 

注意:该方法后面的时间会选取你该小时的第一条,剩余的不会选取

  • 日期在日志开头的例子:
  1. # sed -n '/2019-07-23 09:25:55/,/2019-07-23 10:25:55/p' accessSuccess.log 

查看某时间段到现在的系统日志

  1. # sed -n '/Jun 21 12/,$p' /var/log/messages | less 

问题:能够根据时间来查日志的原理是什么?直接写日期的和正则的有什么区别

原理是匹配到第一个和最后一个的全部打印出来,所以要取9点到10点的日志要打印到11点第一条就能确保9点到10点的都打出来了。直接写日期和正则的区别是一个精确匹配一个模糊匹配。

-i参数

直接修改读取的文件内容,而不是输出到终端。

实例:删除第一行

  1. # sed -i '1d' 1.sql 

实例:删除2-5行

  1. # sed -i '2,5d' 1.sql 

实例:删除每行最后两个字符

  1. # sed -i 's/..$//' 1.sql 

实例:删除每行前两个字符

  1. # sed -i 's/..//' 1.sql 

实例:删除行首的空格

  1. # sed -i 's/^[[:space:]]*//' 1.sql 
  2. # sed -i 's/^[ ]*//' 1.sql 
  3. # sed -i 's/^ *//' 1.sql 

实例:删除空行

  1. # sed -i '/^$/d' 1.sql 

删除配置文件中//号注释行

  1. # sed -i 's#//.*##g' 1.sql 

删除配置文件中#号注释行

  1. # sed -i 's#\#.*##g' 1.sql 

删除最后一行

  1. # sed -i '$d' 1.sql 

删除第一个字符

  1. # sed 's/^.//g' 1.sql 

第一行上添加一行内容

  1. # sed -i '1i insert into adid_intention values ' 1.sql 

插入字符,匹配文本中B开头的行,行尾追加2008

  1. # sed -i 's/B.*/&2008/' 1.sql 

插入字符,匹配文本中B开头的行之前追加2008

  1. # sed -i 's/B.*/2008&/' 1.sql 

替换内容,例如将2-5行的内容替换成case

  1. # sed -i '2,5c case' 1.sql 

将所有以d或D开头的行里所有的x变成X

  1. # sed '^[dD]/s/x/X/g' 1.sql 

替换内容,把aaa替换成bbb

  1. # sed -i 's/aaa/bbb/' 1.sql 
  2. # sed -i 's/aaa/bbb/g' 1.sql 
  3. # sed -i '1,\$s#bbb#aaa#g' 1.sql 
  4. 备注:这两种命令格式的区别在于是否有个“g”。没有“g”表示只替换第一个匹配到的字符串,有“g”表示替换所有能匹配到的字符串,“g”可以认为是“global”(全局的)的缩写,第三条1代表第一行,$代表最后一行,1,$代表从第一行到最后一行 

分隔符可以任意

  1. # sed -i 's#bbb#aaa#g' 1.sql 

 

 

 

-e参数

-e与不加-e的区别

-e 可以在同一行里执行多条命令,不加 -e 只有 's/11/00/g' 进行了操作

  1. # sed 's/11/00/g' 's/22/99/g' 1.sql 
  2. sed:无法读取 s/22/99/g:没有那个文件或目录 
  3. a,aaa,aaa,aaa,a00 
  4. a,aaa,aaa,aaa,a22 
  5. a,aaa,aaa,aaa,a00 
  6. Ba,aaa,axa,aaa,a22 
  7. a,aaa,aaa,aaa,a 

加上 -e 时 's/11/00/g' 与 's/22/99/g' 都进行了操作

  1. # sed -e 's/11/00/g' -e 's/22/99/g' 1.sql 
  2. a,aaa,aaa,aaa,a00 
  3. a,aaa,aaa,aaa,a99 
  4. a,aaa,aaa,aaa,a00 
  5. Ba,aaa,axa,aaa,a99 
  6. a,aaa,aaa,aaa,a 

常用实例:sed获取ip

  1. # ifconfig en0 | sed -e '/inet /!d' //匹配inet 的不删除 
  2. # ifconfig en0 | sed -e '/inet /!d' -e 's/^.*inet//g' //把开头到inet部分替换删除 
  3. # ifconfig en0 | sed -e '/inet /!d' -e 's/^.*inet//g' -e 's/netmask.*$//g' //把netmask到结尾替换删除 
  4. # ifconfig en0 | sed -e '/inet /!d' -e 's/^.*inet//g' -e 's/netmask.*$//g' -e 's/[[:space:]]*//g' //最后去掉首位空格 

常用实例:处理以下文件内容,将域名取出并根据域名进行计数排序处理

  1. # cat aaa.log 
  2. http://www.tyun.cn/index.html 
  3. http://www.tyun.cn/1.html 
  4. http://post.tyun.cn/index.html 
  5. http://mp3.tyun.cn/index.html 
  6. http://www.tyun.cn/3.html 
  7. http://post.tyun.cn/2.html 
  8.  
  9. # sed -e 's#^.*//\(.*tyun.*\)/.*html#\1#gp' aaa.log | sort | uniq -c | sort -rn 

 

责任编辑:武晓燕 来源: 新钛云服
相关推荐

2021-03-11 00:07:30

线程Thread程序

2010-07-05 12:40:56

SQL Server

2020-05-13 17:15:49

CPUPC处理器

2021-08-19 10:30:13

Java集合排序程序开发

2024-06-18 10:28:46

2021-11-26 00:02:00

模式正则修饰符

2021-07-26 05:20:47

JavaScript解构赋值数组解构

2024-07-17 11:35:31

JavaScript解构赋值

2024-09-10 15:34:18

JavaScript解构赋值

2023-09-01 08:59:57

2021-08-16 06:56:21

Slice数组类型内存

2010-09-06 09:25:42

Web应用程序

2021-03-24 09:37:41

数据类型数据分析数据的分类

2023-02-26 14:34:18

OSW操作系统监控

2022-11-28 07:21:53

操作系统内存管理

2023-01-31 08:48:49

Go语言文件

2010-04-19 17:39:50

Unix操作系统

2020-06-04 18:30:06

二手硬件CPU主板

2022-03-09 09:39:22

Python函数模块

2021-04-15 10:00:46

Java基础ListJava开发
点赞
收藏

51CTO技术栈公众号