sed常用用法总结

sed命令的语法格式

sed的命令格式: sed [option] 'sed command'filename

sed命令的选项(option)

-n :只打印模式匹配的行

-e :直接在命令行模式上进行sed动作编辑,此为默认选项

-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作

-r :支持扩展表达式

-i :直接修改文件内容

常用的命令匹配模式
xx为行号
x,y表示行号从x到y
x~stepx 指起始匹配行, step 指步长,例如: sed -n 2~5p 含义:从第二行开始匹配,隔 5 行匹配一次,即 2,7,12
/pattern查询包含模式的行
/pattern/, /pattern/查询匹配到2行之间的所有行
pattern/,x在给定行号上查询包含模式的行
x,/pattern/通过行号和模式查询匹配的行
x,y!查询不包含指定行号x和y的行
sed的编辑命令(sed command)
p打印匹配行(和-n选项一起合用)
=显示文件行号
a\在定位行号后附加新文本信息
i\在定位行号前插入新文本信息
d删除定位行
c\用新文本替换定位文本
w filename写文本到一个文件,类似输出重定向 >
r filename从另一个文件中读文本,类似输入重定向 <
s使用替换模式替换相应模式
q第一个模式匹配完成后退出或立即退出
l显示与八进制ACSII代码等价的控制符
{}在定位行执行的命令组,用分号隔开
n从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理
N在数据流中添加下一行以创建用于处理的多行组
g将模式2粘贴到/pattern n/
y传送字符,替换单个字符
使用正则表达式、扩展正则表达式
^锚点行首的符合条件的内容,用法格式"^pattern"
$锚点行首的符合条件的内容,用法格式"pattern$"
^$空白行
.匹配任意单个字符
*匹配紧挨在前面的字符任意次(0,1,多次)
.*匹配任意长度的任意字符
\?匹配紧挨在前面的字符0次或1次
{m,n}匹配其前面的字符至少m次,至多n次
{m,}匹配其前面的字符至少m次
{m}精确匹配前面的m次{0,n}:0到n次
<锚点词首----相当于 \b,用法格式:<pattern
>锚点词尾,用法格式:>pattern
<pattern>单词锚点
分组,用法格式:pattern,引用\1,\2
[]匹配指定范围内的任意单个字符
[^]匹配指定范围外的任意单个字符
[:digit:]所有数字, 相当于0-9, [0-9]—> [[:digit:]]
[:lower:]所有的小写字母
[:upper:]所有的大写字母
[:alpha:]所有的字母
[:alnum:]相当于0-9a-zA-Z
[:space:]空白字符
[:punct:]所有标点符号

正则表达式示例

#######sed的匹配模式支持正则表达式#####################  
sed '5 q' /etc/passwd #打印前5行  
sed -n '/r*t/p' /etc/passwd#打印匹配r有0个或者多个,后接一个t字符的行  
sed -n '/.r.*/p' /etc/passwd#打印匹配有r的行并且r后面跟任意字符  
sed -n '/o*/p' /etc/passwd#打印o字符重复任意次  
sed -n '/o\{1,\}/p' /etc/passwd#打印o字重复出现一次以上  
sed -n '/o\{1,3\}/p' /etc/passwd#打印o字重复出现一次到三次之间以上  
常用的例子

存在如下文件:

first 
second
#

third
fourth
     # test 
five
six
  • 从第一行开始,每隔2行打印一次sed -n '1~2p' sed.txt
first 
#
third
     # test 
six
  • 打印1-3行内容,并输出行号sed -n '1,3{=;p}' sed.txt

    当用到sed不同饿编辑命令时候,用{}且不同编辑命令之间用分号。

[root@localhost ~]# sed -n '1,3{=;p}' sed.txt
1
first 
2
second
3
#

  • 打印从第一行开始,匹配到某一行所有行:sed -n '1,/third/p' sed.txt

  • 打印从匹配的行开始,至最后一行内容:sed -n '/third/, $p' sed.txt

    $表示是最后一行,也可以表示行尾

[root@localhost ~]# sed -n '1,/third/p' sed.txt 
first 
second
#

third
[root@localhost ~]# sed -n '/third/, $p' sed.txt 
third
fourth
     # test 
five
six

​ 可以基于这个,实现打印某个区间段的日志:

log.log日志如下:
2021-04-09 11:23:09 INFO: request:  GET https://127.0.0.1:4569/lease_communication {"uuid"=>"uuid"} [127.0.0.1]
2021-04-09 11:23:09 INFO: response: 200
2021-04-09 11:23:09 INFO: request:  GET https://127.0.0.1:4569/lease_communication {"uuid"=>"uuid"} [127.0.0.1]
2021-04-09 11:23:09 INFO: response: 200
2021-04-09 11:23:10 INFO: request:  GET https://10.2.2.20:4569/lease_collect_files {"member_id"=>1, "uuid"=>"uuid"} [10.2.2.20]
2021-04-09 11:23:10 INFO: response: 200
2021-04-09 11:23:10 INFO: request:  DELETE https://10.2.2.20:4569/lease_collect_files {"files"=>[], "uuid"=>"uuid"} [10.2.2.20]
2021-04-09 11:23:10 INFO: response: 200
2021-04-09 11:23:31 INFO: request:  GET https://localhost:4569/service {"uuid"=>"uuid", "command_queue_running_id"=>"[zdns:dcp_agent]#", "command_version"=>nil} [::1]
2021-04-09 11:23:32 INFO: response: 200
2021-04-09 11:23:32 INFO: request:  GET https://localhost:4569/service {"uuid"=>"uuid", "command_queue_running_id"=>"[zdns:dcp_agent]#", "command_version"=>nil} [::1]
2021-04-09 11:23:32 INFO: response: 200
2021-04-09 11:23:32 INFO: request:  GET https://localhost:4569/discover-result {"uuid"=>"uuid", "command_queue_running_id"=>"[zdns:dcp_agent]#", "command_version"=>nil} [::1]
2021-04-09 11:23:32 INFO: response: 200
2021-04-09 11:23:32 INFO: request:  GET https://localhost:4569/dhcp-failovers/alarm {"uuid"=>"uuid", "command_queue_running_id"=>"[zdns:dcp_agent]#", "command_version"=>nil} [::1]
2021-04-09 11:23:32 INFO: response: 200
2021-04-09 11:24:09 INFO: request:  GET https://127.0.0.1:4569/lease_communication {"uuid"=>"uuid"} [127.0.0.1]
2021-04-09 11:24:09 INFO: response: 200
2021-04-09 11:24:09 INFO: request:  GET https://127.0.0.1:4569/lease_communication {"uuid"=>"uuid"} [127.0.0.1]
2021-04-09 11:24:09 INFO: response: 200
2021-04-09 11:24:12 INFO: request:  GET https://10.2.2.20:4569/lease_collect_files {"member_id"=>1, "uuid"=>"uuid"} [10.2.2.20]
2021-04-09 11:24:12 INFO: response: 200
2021-04-09 11:24:12 INFO: request:  DELETE https://10.2.2.20:4569/lease_collect_files {"files"=>[], "uuid"=>"uuid"} [10.2.2.20]
2021-04-09 11:24:12 INFO: response: 200
2021-04-09 11:24:34 INFO: request:  GET https://localhost:4569/service {"uuid"=>"uuid", "command_queue_running_id"=>"[zdns:dcp_agent]#", "command_version"=>nil} [::1]
2021-04-09 11:24:34 INFO: response: 200
2021-04-09 11:24:34 INFO: request:  GET https://localhost:4569/service {"uuid"=>"uuid", "command_queue_running_id"=>"[zdns:dcp_agent]#", "command_version"=>nil} [::1]
2021-04-09 11:24:35 INFO: response: 200

​ 打印2021-04-09 11:23:31-2021-04-09 11:24:09时间段的日志:

sed -n '/2021-04-09 11:23:31/, /2021-04-09 11:24:09/p' log.log

[root@localhost ~]# sed -n '/2021-04-09 11:23:31/, /2021-04-09 11:24:09/p' log.log 
2021-04-09 11:23:31 INFO: request:  GET https://localhost:4569/service {"uuid"=>"uuid", "command_queue_running_id"=>"[zdns:dcp_agent]#", "command_version"=>nil} [::1]
2021-04-09 11:23:32 INFO: response: 200
2021-04-09 11:23:32 INFO: request:  GET https://localhost:4569/service {"uuid"=>"uuid", "command_queue_running_id"=>"[zdns:dcp_agent]#", "command_version"=>nil} [::1]
2021-04-09 11:23:32 INFO: response: 200
2021-04-09 11:23:32 INFO: request:  GET https://localhost:4569/discover-result {"uuid"=>"uuid", "command_queue_running_id"=>"[zdns:dcp_agent]#", "command_version"=>nil} [::1]
2021-04-09 11:23:32 INFO: response: 200
2021-04-09 11:23:32 INFO: request:  GET https://localhost:4569/dhcp-failovers/alarm {"uuid"=>"uuid", "command_queue_running_id"=>"[zdns:dcp_agent]#", "command_version"=>nil} [::1]
2021-04-09 11:23:32 INFO: response: 200
2021-04-09 11:24:09 INFO: request:  GET https://127.0.0.1:4569/lease_communication {"uuid"=>"uuid"} [127.0.0.1]

需要特别注意的是,2021-04-09 11:23:31和2021-04-09 11:24:09必须要在日志中能够匹配到,否则打印的结果就不准确。原因就是,/2021-04-09 11:23:31/, /2021-04-09 11:24:09/,分别对应的是开启和结束的行,如果匹配不到,就找不到对应的行,打印的结果就不准确

  • 打印非#开头的行:sed -n '/^#/!p' sed.txt

    !表示对前面的匹配的结果取反

[root@localhost ~]# sed -n '/^#/!p' sed.txt 
first 
second

third
fourth
     # test 
five
six
  • 打印去除空格开头、#开头的行:

    sed -e '/^#/d' -e '/^$/d' -e '/^[[:space:]]/d' sed.txt

    通过e可以实现对单个文件实现不同的操作。^$是匹配到空行,^[[:space:]]匹配以空格开头的行,为什么要加个[],目前还不是很清楚。匹配到的字符

  • 替换匹配到的内容,格式为:sed -e s/匹配内容/替换内容/g 文件,g 是一个全局替换标志,就是替换所有匹配内容。如果不加g,只会匹配每行的第一个并替换

    • 在每行开头添加line的内容:sed -e 's/^/line /' sed.txt
    • 在每行结尾添加line的内容:sed -e 's/$/ line/' sed.txt
    • 替换#符号为//sed -e 's/#/\/\//g' sed.txt
    • 替换指定行的内容:sed -e '1,3 s/#/\/\//g' sed.txt
[root@localhost ~]# sed -e 's/^/line /' sed.txt
line first 
line second
line #
line 
line third
line fourth
line      # test 
line five
line six
[root@localhost ~]# sed -e 's/$/ line/' sed.txt 
first  line
second line
# line
 line
third line
fourth line
     # test  line
five line
six line
[root@localhost ~]# sed -e 's/#/\/\//9' sed.txt
first 
second
//

third
fourth
     // test 
five
six
[root@localhost ~]# sed -e '1,3 s/#/\/\//g' sed.txt
first 
second
//

third
fourth
   # test 
five
six
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值