Linux sed 工具

sed工具

sed能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果


  1. sed命令的语法格式
sed的命令格式: sed [option] 'sed command'filename

sed的脚本格式:sed [option] -f 'sed script'filename
  1. sed命令的选项(option)
-n :只打印模式匹配的行

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

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

-r :支持扩展表达式

-i :直接修改文件内容
  1. sed在文件中查询文本的方式
  • 1.使用行号,可以是一个简单数字,或是一个行号范围
命令解释
x行号
x,y表示行号从x到y
/pattern查询包含模式的行
/pattern /pattern查询包含两个模式的行
pattern/,x在给定行号上查询包含模式的行
x,/pattern/通过行号和模式查询匹配的行
x,y!查询不包含指定行号x和y的行
# 打印匹配到的行
[root@localhost ~]# sed -n '3 p' name_port.txt 
localproxy-zs.1.dyaj8a3mryhro6mua4upciy5j  8081/tcp
# 打印1-3行
# sed不同编辑命令时,用{},且不同编辑命令用分号隔开
[root@localhost ~]# sed -n '1,3 {=;p}' name_port.txt 
1
NAMES                                      PORTS
2
nginx.1.6jnva6r45z2nrfm8ctw0xwev3          80/tcp
3
localproxy-zs.1.dyaj8a3mryhro6mua4upciy5j  8081/tcp
# /myshop/,/localproxy/ 打印匹配myshop和localproxy的字段
[root@localhost ~]# sed -n '/myshop/,/localproxy/ {=;p}' name_port.txt 
4
myshopservice.1.84vpo43uvztdhy7o693jbt7kl  8081/tcp
5
myshopcust.1.3zg47ojds95rayf27z376cf2m     8081/tcp
6
zookeeper.1.be3e3zlz1yj3s5vdib5vn2gkh      2181/tcp,  2888/tcp,
7
smgM001.1.jrc45ze7myt8e7jfswxpt8fso        8081/tcp
8
redis.1.9uisnzzb51qwtj0q4i524npf0          6379/tcp
9
memcached.1.tvpjqgjrjinq08e0zpr94amo8      11211/tcp
10
localproxy.1.o4uerjr0koy6zhe988ghld7bq
  • 2.使用正则表达式、扩展正则表达式(必须结合-r选项)
正则表达式解释
^匹配每一行的开头
$匹配每一行的结尾
.匹配除换行符之外的任意单个字符
*匹配紧挨在前面的字符任意次(0,1,多次)
\+“+”匹配一次或多次他前面的字符,例如 空格+ 或 “:+“匹配至少一个或多个空格和至少一个或多个:
\?匹配紧挨在前面的字符0次或1次
[0-9] [a-z] [A-Z]匹配指定字符的行
|管道符号用来匹配两边任意一个子表达式,子表达式1
\{m\}精确匹配该正则m次
\{m,n\}表明精确匹配该正则至少m,最多n次,m和n不能是负数,并且要小于255
\b\b用来匹配单词开头(\bxx)或(xx\b)的任意字符,因此\bthe\b将匹配the,但不匹配they,\bthe将匹配the或they
\(n\)\1匹配重复出现的字符
\([0-9]\)\1同理,“([0-9])\1“匹配连续两个相同的数字,如11,22,33 ····
# ^ 匹配45开头
[root@localhost ~]# sed -n '/^45/ p' name_port.txt 
4513/master    127.0.0.1:25
4513/master    ::1:25
# $ 匹配1结尾
[root@localhost ~]# sed -n '/1$/ p' name_port.txt 
memcached.1.lnxbm5w6whni37ts2vcpk4011
localproxy.1.n17uwv5kuhd2fyqm4nrrey0s1
localproxy.1.1jaqrr97vndnl1mk4dpkutk11
4211/dockerd   :::11211
4211/dockerd   :::2181
# . 匹配ja
[root@localhost ~]# sed -n '/ja../ p' name_port.txt 
localproxy.1.kbs7wdgtcxalzzcebv2jagybq
memcached.1.g5bgqabibqojaluo1w0y1yhe9
localproxy.1.1jaqrr97vndnl1mk4dpkutk11
4207/java      127.0.0.1:8006
4207/java      :::8010
4207/java      :::8082
# * 匹配java 开头的
[root@localhost ~]# sed -n '/java *./ p' name_port.txt 
4207/java      127.0.0.1:8006
4207/java      :::8010
4207/java      :::8082
# \+ 匹配一个或多个:
sed -n '/:\+/ p' name_port.txt 
4147/sshd      0.0.0.0:10022
4513/master    127.0.0.1:25
4207/java      127.0.0.1:8006
4147/sshd      :::10022
4211/dockerd   :::2377
4211/dockerd   :::7946
4207/java      :::8010
4211/dockerd   :::11211
4207/java      :::8082
4211/dockerd   :::8086
4513/master    ::1:25
4211/dockerd   :::2181
0.0.0.0:68
127.0.0.1:323
0.0.0.0:4789
:::7946
::1:323
# \? 匹配前面包含ja的行
[root@localhost ~]# sed -n '/ja \?/ p' name_port.txt 
localproxy.1.kbs7wdgtcxalzzcebv2jagybq
memcached.1.g5bgqabibqojaluo1w0y1yhe9
localproxy.1.1jaqrr97vndnl1mk4dpkutk11
4207/java      127.0.0.1:8006
4207/java      :::8010
4207/java      :::8082
# 匹配包含1、8、或者9的行
[root@localhost ~]# sed -n '/[189]/p' name_port.txt 

# 匹配包含 A、B的行
[root@localhost ~]# sed -n '/[AB]/p' name_port.txt 
NAMES                                      PORTS

# 匹配包含m、n 的行
[root@localhost ~]# sed -n '/[mn]/p' name_port.txt 
nginx.1.6jnva6r45z2nrfm8ctw0xwev3          80/tcp
localproxy-zs.1.dyaj8a3mryhro6mua4upciy5j  8081/tcp
# | 管道符号,匹配包含4147 4211 4207的行 
[root@localhost ~]# sed -n '/4147\|4211\|4207/p' name_port.txt 
4147/sshd      0.0.0.0:10022
4207/java      127.0.0.1:8006
4147/sshd      :::10022
4211/dockerd   :::2377
4211/dockerd   :::7946
4207/java      :::8010
4211/dockerd   :::11211
4207/java      :::8082
4211/dockerd   :::8086
4211/dockerd   :::2181
# 打印 包含5个数字的行
sed -n '/^[0-9]\{5\}$/p' number.txt 
12345
# 打印由4至6个数字组成的行
[root@localhost tmp]# sed -n '/^[0-9]\{4,6\}$/p' number.txt 
1234
12345
123456
# \b用来匹配单词开头(\bxx)或(xx\b)的任意字符,因此\bmem\b将匹配the,但不匹配memcached,\bthe将匹配mem或memcached
[root@localhost ~]# sed -n '/\bmem/ p' name_port.txt 
memcached.1.tvpjqgjrjinq08e0zpr94amo8      11211/tcp
memcached.1.35td9xsr0w8f8d2vnri3g23bx
memcached.1.qcdxlj8pimha8zsd9awdkbsq9

[root@localhost ~]# sed -n '/\bmem\b/ p' name_port.txt 
[root@localhost ~]# 
# \(n\)\1 匹配重复出现的字符
[root@localhost ~]# sed -n '/\(4\)\1/ p' name_port.txt 
memcached.1.pwfl2k6fhiok11y1a44h0cdj3
localproxy.1.0qgcoewz33oyf9zdfqpd4469l

[root@localhost ~]# sed -n '/\(h\)\1/ p' name_port.txt 
localproxy.1.lkti33z8myijzxhhrbvjmaoa3
localproxy.1.y5y28q9s0rnwhh8zjrfopgtin
memcached.1.joq8shhbplkc813sx9m62ta0z

[root@localhost ~]# sed -n '/\(:\)\1/ p' name_port.txt 
4147/sshd      :::10022
4211/dockerd   :::2377
4211/dockerd   :::7946
4207/java      :::8010
4211/dockerd   :::11211
4207/java      :::8082
4211/dockerd   :::8086
4513/master    ::1:25
4211/dockerd   :::2181
:::7946
::1:323
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炎方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值