linux基础(day27)
时间:2022-04-27
本文章向大家介绍linux基础(day27),主要内容包括9.4 sed(上)、9.5sed(下)、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
9.4 sed(上)
sed工具
- sed -n '5'p test.txt
- sed -n '1,5'p test.txt
- sed -n '1,$'p test.txt
- sed -n '/root/'p test.txt
- sed -n '/^1/'p test.txt
- sed -n 'in$'p test.txt
- sed -n '/r..o/'p test.txt
- sed -n 'oo*'p test.txt
- sed -e '1'p -e '/111/'p -n test.txt
sed介绍
[root@localhost ~]# mkdir sed
[root@localhost ~]# cd sed
[root@localhost sed]# cp ../grep/passwd test.txt
[root@localhost sed]# pwd
/root/sed
[root@localhost sed]# ls
test.txt
[root@localhost sed]#
- sed和grep相比较而言,sed也能实现grep的功能,但比较麻烦,也不会有颜色显示
- sed优势:在于替换,替换指定的字符
sed命令 实现grep匹配的功能
- sed -n '/root/'p test.txt //匹配root关键词,并打印出来
- sed匹配的关键是 //
- 若不加 -n 参数,则会把文件所有内容打印出来,而且,匹配出来的行连续打印两次
- 加 -n 参数后,则就只会显示root所在的行
[root@localhost sed]# sed '/root/'p test.txt //输出文件所有内容, 并匹配出root的行连续打印两次
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
等等等,只截取了一部分
在添加 -n参数后,则只会匹配出需要的两行
[root@localhost sed]# sed -n '/root/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]#
sed匹配的其他用法
- sed支持. * 还有特殊符号+
- sed -n '/r.o/'p test.txt //匹配出包含r 和o 的字符
- 其中的 . 表示匹配任意的一个字符,只能是一个字符
- 这个点可以是字符,英文字母,数字,特殊符号(包括 . )
[root@localhost sed]# sed -n '/r.o/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
- sed -n '/r*o/'p test.txt //表示匹配星号左边的h字符,重复0到N次
- 星号* ,表示* 前面需要有一个字符 表示0个或多个*前面的字符 跟后面有啥没有关系
- h* 可以是啥都没有啊(包括0个h)
- h*n 只要有n就匹配
[root@localhost sed]# sed -n '/r*o/'p test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
等等等,只截取了一部分
- sed -n '/r+o/'p test.txt //表示匹配一次或多次 r 字符——>若不想使用脱义字符,则可以使用 -r 参数,如下
- 等于sed -nr '/r+o/'p test.txt
- +加号,表示加号前面的字符,一次或多次
- 对比 * 号,区别是号是0次或多次
[root@localhost sed]# sed -nr '/r+o/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]#
- sed -nr '/o{2}/'p test.txt //匹配连续两次出现 o 的行
[root@hf-01 sed]# sed -nr '/o{2}/'p test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@hf-01 sed]#
- sed -n '/^h/'p test.txt //匹配以h字符开头的行
[root@hf-01 sed]# sed -n '/^h/'p test.txt //匹配以h字符开头的行
halt:x:7:0:halt:/r.o:/sbin/halt
hhhhhao
- sed -nr '/root|nologin/'p test.txt //匹配出现root或nologin的行
[root@hf-01 sed]# sed -nr '/root|nologin/'p test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
等等等,只截取了一部分
sed命令打印指定的行
- sed -n '2'p test.txt //打印文件中指定的第二行
[root@hf-01 sed]# sed -n '2'p test.txt //打印指定的第二行
bin:x:1:1:bin:/bin:/sbin/nologin
[root@hf-01 sed]#
- sed -n '2,5'p test.txt //打印文件中的第二行到第五行
[root@hf-01 sed]# sed -n '2,5'p test.txt //打印文件中的2到5行
bin:x:1:1:bin:/bin:/sbin/nologin
adas:124:bdsf:rto:pass
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dfdf:rggo:124
[root@hf-01 sed]#
- sed -n '24,$'p test.txt //打印24行到最后一行的文件
- $ 表示末行,最后一行
[root@hf-01 sed]# sed -n '24,$'p test.txt
asfhan
dannnnnn
hhhhhao
[root@hf-01 sed]#
- sed -n '1,$'p test.txt //打印文件中所有的行
[root@hf-01 sed]# sed -n '1,$'p test.txt //打印从第一行到结束的行
- sed -n '/in$/'p test.txt //匹配以in结尾的行
[root@localhost sed]# sed -n '/in$/'p test.txt //匹配以in结尾的行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
等等等,只截取了一部分
sed命令 -e 表达式
- sed -e '1'p -e '/111/'p -n test.txt //表示在两个表达式中,先文件中匹配第一段字符,然后在匹配bus的字符段
- -e 表示在同一个表达式里面做多个动作
- 在-e的两个表达式中重合,就会打印两次(看例子)——>可以写多个表达式
- sed -e '1'p -e '/111/'p -e '/root/'p -n test.txt
[root@hf-01 sed]# sed -e '1'p -e '/bus/'p -n test.txt //表示在一个表达式中,先文件中匹配第一段字符,然后在匹配bus的字符段
root:x:0:0:root:/root:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
在两个-e的表达式中是重合的,则会打印两次
[root@hf-01 sed]# sed -e '1'p -e '/root/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@hf-01 sed]#
- sed -e '1'p -e '/111/'p -e '/root/'p -n test.txt //在表达式中多次匹配,并打印出来(重合的会继续打印)
[root@hf-01 sed]# sed -e '1'p -e '/root/'p -e '/root/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@hf-01 sed]#
sed命令匹配不区分大小写 I
- sed -n '/bus/'Ip test.txt //匹配文件中bus字符,不区分大小写
9.5sed(下)
sed工具
- sed '1'd test.txt
- sed '1,3'd test.txt
- sed '/oot/'d test.txt
- sed '1,2s/ot/to/g' test.txt
- sed 's#ot#to#g' test.txt
- sed 's/[0-9]//g' test.txt
- sed 's/[a-zA-Z]//g' test.txt
- sed -r 's/(rot)(.*)(bash)/321/' test.txt
- sed 's/^.*$/123&/' test.txt
- sed -i 's/ot/to/g' test.txt
sed命令删除指定的行
- sed '1,20'd test.txt //删除指定的行(但实质并未删除,只是将剩余的行列出来——>使用wc -l命令可查看原有的行并未删除)
[root@hf-01 sed]# sed '1,20'd test.txt
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/bin/bash
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
asfhan
dannnnnn
hhhhhao
[root@hf-01 sed]# wc -l test.txt
26 test.txt
- sed -i '1,20'd test.txt //删除指定的行(在加了-i参数后,会把文件内容删除)
[root@hf-01 sed]# cp test.txt test.txt.bak
[root@hf-01 sed]# sed -i '1,20'd test.txt
[root@hf-01 sed]# wc -l test.txt
6 test.txt
[root@hf-01 sed]#
- 总结,sed删除指定的行
- 在直接 sed '1,20'd test.txt 仅仅是剩余的行列出到屏幕上,而其他的行不列,并未删除文件
- 而在加了 -i 参数后,sed -i '1,20'd test.txt 会把文件内容删除更改
sed命令 指定内容删除
- sed -i '/sshd/'d test.txt //加了-i 参数后,会直接修改文件内容
[root@hf-01 sed]# sed -i '/sshd/'d test.txt //会直接修改文件内容,删除sshd这一行
[root@hf-01 sed]# cat test.txt
mysql:x:1000:1000::/home/mysql:/bin/bash
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
asfhan
dannnnnn
hhhhhao
[root@hf-01 sed]#
sed命令 查找替换 功能
- sed 命令的查找替换和vim的查找替换相似
- sed '1,5s/nologin/lala/g' test.txt //在1到5行中,把nologin替换成lala
- 会把这个文件中所有内容都打印出来
- g表示全局替换
[root@hf-01 sed]# sed '1,5s/nologin/lala/g' test.txt //把文件中1到5行中的nologin替换成lala
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/lala
adas:124:bdsf:rto:pass
daemon:x:2:2:daemon:/sbin:/sbin/lala
dfdf:rggo:124
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
等等等,只截取了一部分
[root@hf-01 sed]#
- 正则表达式中查找替换
- sed -r '1,5s/ro+/r/g' test.txt //将文件的1到5行中的ro+替换成r
- 因为有特殊符号,所以得使用 -r 参数
- (在使用cat test.txt的时候,会发现并没有真实替换,只是打印出在屏幕上替换了)
[root@hf-01 sed]# sed -r '1,5s/ro+/r/g' test.txt //将文件的1到5行中的ro+替换成r
rt:x:0:0:rt:/rt:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adas:124:bdsf:rto:pass
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dfdf:rggo:124
等等等,只截取了一部分
- sed查找替换总结:
- 若里面有特殊符号,则需要脱义 - 只能先使用-ri参数,而不能-ir参数(-r参数脱义特殊符号,-r参数直接修改文件内容) - 或者在特殊符号前面使用
sed命令 第一段和最后一段替换位置
- head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/3:2:1/' 把文件的前10行的第一段和最后一段进行替换位置
- head 默认查看前10行
- s 前不指定范围,就表示全部
- .* 表示贪婪匹配
[root@localhost sed]# head test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
对比
[root@localhost sed]# head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/3:2:1/'
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:11:0:operator:/root:operator
[root@localhost sed]#
- 需求:把第一段和最后一段替换位置,因为内容是用 : 冒号分割的,所以可以使用 : 冒号作为分割对象
- 前面用小括号括的内容,后面的就要用反斜杠 加数字 去表示它
sed命令 将/root 替换成123 需要脱义
- head tset.txt |sed 's//root/123/g' //在文件前5行,把/root 替换成 123
[root@localhost sed]# head test.txt |sed 's//root/123/g'
root:x:0:0:root:123:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost sed]#
- 若替换的内容中有多个/ ,比如/sbin/nologin 替换成123
- 则需要使用脱义符号 ,或者使用@
- head test.txt |sed 's//sbin/nologin/123/g' //替换/sbin/nologin内容中有多个 /
[root@localhost sed]# head -n5 test.txt |sed 's//sbin/nologin/123/g'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
lp:x:4:7:lp:/var/spool/lpd:123
[root@localhost sed]#
- 也可以替换分隔符使用 @ 或者 # 替代——>只要可以去区分开就可以
[root@localhost sed]# head - n5 test.txt |sed 's@/sbin/nologin@123@g'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
lp:x:4:7:lp:/var/spool/lpd:123
[root@localhost sed]# head test.txt |sed 's#/sbin/nologin#123#g'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
lp:x:4:7:lp:/var/spool/lpd:123
[root@localhost sed]#
sed命令 删除文件中所有英文字母 's/[a-zA-Z]//g'
- head -n5 test.txt |sed 's/[a-zA-Z]//g' //删除前5行中所有的英文字母
- 只需要替换成 空 即可,就会删除所有的英文字母
[root@localhost sed]# head -n5 test.txt |sed 's/[a-zA-Z]//g' //删除前5行中所有的英文字母
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
[root@localhost sed]#
sed命令在 所有行前面加上字符串
- head -n5 test.txt |sed -r 's/(.*)/aaa:&/' //在前5行中,所有行前面添加aaa字符
- (.*) 表示一整行
- &符号就表示前面的小括号
[root@localhost sed]# head -n5 test.txt |sed -r 's/(.*)/aaa:&/' //在前5行中,所有行前面添加aaa字符
aaa:root:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost sed]#
- 数据库记录安全解决方案
- 基于计算机视觉和OpenCV:创建一个能够计算道路交通流量的应用
- 这或许是对小白最友好的python入门了吧——20,定义函数简单应用
- 数据库结构版本控制
- Extjs4---Cannot read property 'addCls' of null 或者 el is null 关于tab关闭后再打开不显示或者报错
- 【干货】什么?Python3.X不能输出中文?原来是编辑器geany的锅?!
- Shell 历史记录异地留痕审计与监控
- [译]WebAPI下的如何实现参数绑定
- 这或许是对小白最友好的python入门了吧——10,元组
- Extjs 在项目中碰到问题
- 网站防刷方案
- 如何正确的猜拳:反事实遗憾最小化算法
- 使用python中的Numpy进行t检验
- 实操 Web Cache
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法