13.Shell之sed

小破站学习笔记

掌握sed的基本用法

Sed的常用命令 打印p 删除d 插入i等

  • Win下的编程开发工具

Notepad++
Ultraedit
Editplus

  • linux下的工具

Vim vi
gedit nano emacs

sed用来做什么

Sed是stream editor(流编辑器)的缩写,简称流编辑器;用来处理文件的

Sed如何处理文件

Sed是一行一行读取文件内容并按要求进行处理,把处理后的结果输出到屏幕
1.由于sed把每一行都保留在临时缓冲区中,对整个副本进行编辑,所以不会直接修改源文件
2.Sed主要用来自动编辑一个或者多个文件,简化对文件的反复操作,对文件进行行过滤和转换操作

Sed使用方法

语法格式2种

命令行模式
脚本模式
  • 语法格式
Sed [options] ‘处理动作’ 文件名
-e 进行多项(多次)编辑
-n 取消默认输出 不自动打印
-r 使用扩展正则表达式
-i 原地编辑(修改源文件)
-f 指定sed脚本的文件名
  • 常见处理动作 都在单引号里面
'p' 打印
'i' 在指定行之前插入内容
'a' 在指定行之后插入内容
'c' 替换指定行所有内容
'd' 删除指定行
  • 对文件进行增,删,改,查操作
  • 打印内容
sed '' 1.txt
不对文件做任何更改
sed 'p' 1.txt
会打印2次每行
sed -n 'p' 1.txt
打印文件 打印一次 通常 n p 一起使用
sed -n '2p' 1.txt
打印第二行
sed -n '1,5p' 1.txt
打印一到五行
sed -n '$p' 1.txt
打印最后一行
sed -n '1p' 1.txt
打印第一行
  • 增加文件内容
sed '2ihello world' 1.txt
在文件的第二行上面插入一行hello world
sed 'ihello world' 1.txt
不写是哪一行 默认每一行都执行
sed '3ihello\nworld' 1.txt
在文件的第三行前插入2行 分别是hello和world 换行符隔开
sed '3i\
hello\
world\
888' 1.txt
和上面效果一样 插入多行
sed 'a999' 1.txt
在文件的每一行的下面加一行999
sed '$a999' 1.txt
在文件的最后一行加一行999
sed '2,4a9999' 1.txt
在文件的第二行到第四行 每一行下面都加一行999
  • 修改文件内容
sed '$chell world' 1.txt
替换文件的最后一行为hello world
c整行替换
sed '/^adm/czss' 1.txt
把文件内以adm开头的行整行替换为zss
sed 'czss' 1.txt
替换文件内的所有行
sed '1,5czss' 1.txt
将一到五行替换为zss并压缩为一行显示
  • 删除文件内容
sed '4d' 1.txt
删除第四行
sed '1,4d' 1.txt
删除1到4行
sed 'd' a.txt
删除所有行
sed '/[0-9]/d' 1.txt
删除包含数字的行
sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/d' 1.txt
删除文件内包含ip的行
sed '$d' 1.txt
删除最后一行
  • 对文件进行搜索替换操作
    语法
sed 选项 's/搜索内容/替换内容/动作' 需要处理的文件
s 表示搜索关键字 search
/ 表示分隔符 可以自己定义
动作一般是打印p或者全局替换g
sed -n 's/root/ROOT/p' 1.txt
搜索root替换为ROOT 并显示
sed -n 's/^#//gp' 1.txt
搜索#替换为空 删除#
sed -n 's@/sbin/nologin@/sbin/zss' 1.txt
搜索替换 分隔符可以自定义 搜索内容涉及到/ 选哟转义的 可以用别的分隔符 就不用转义了
sed -n '1,5s/^/#/gp' 1.txt
搜索1-5行行首替换为#
sed -n 's/\(10.1.1.\)1/\1254/gp' 1.txt
搜索10.1.1.1 替换为 10.1.1.254
\(10.1.1.\) 表示为 \1 
  • 其他命令
r 从另外的文件读取内容
w 内容另存为
& 保存查找串以便在替换串中引用 和\(\)相同
= 打印行号
! 取反 '1,5!p'
q 退出
sed '3r /etc/passwd' 1.txt
读取/etc/passwd下的内容放到1.txt的第三行
sed 'r /etc/passwd' 1.txt
读取/etc/passwd下的内容放到1.txt的每一行
sed '$r /etc/passwd' 1.txt
读取/etc/passwd下的内容放到1.txt的最后一行
sed '1,5w 11.txt' 1.tx
把1.txt的1到5行保存到11.txt文件里
sed -n '1,5s/^/#/p' 1.txt
把文件的一到5行替换为#开头
sed -n 's/^sync/#&/gp' 1.txt
搜索以sync开头的 并把sync替换为#sync 这里&代表保留了匹配的sync
sed -n '/root/=;/root/p' 1.txt
首先打印行号 再显示匹配的行 用;分割
sed -n '1,5!p' 1.txt
打印除了1-5行的内容
sed '/shutdown/q' 1.txt
匹配到shutdown后退出
  • 其他选项
-e 多项编辑
-r 扩展正则
-i 修改源文件
sed -ne '/root/p' 1.txt -ne '/root/='
打印匹配root的行 再打印匹配行的行号
sed -ne '/root/=' -ne '/root/p' 1.txt
和上面效果差不多
sed -e '5ihello world' -e '8a哈哈哈' 1.txt -e '/root/=;/zss/='
在文件的第五行上面插入hello world,在文件的第八行下面插入哈哈哈,显示匹配到对应内容的行号
sed -ne '1p' -ne '5p' 1.txt
sed -ne '1p;5p' 1.txt
打印第一行和第五行
grep -Ev '^#|^$' 1.txt
sed -e '/^#/d' -e '/^$/d' 1.txt
sed '/^#/d;/^$/d' 1.txt
sed -r '/^#|^$/d' 1.txt 
删除文件内空行 #开头的内容
sed -e '/^#/d' -e '/^;/d' -e '/^$/d' -e '/^\t$/d' -e '/^\t#/d' smb.conf
sed -r '/^(#|$|;\t#|\t$)/d' smb.conf
过滤文件中生效的行
grep '^[^a-z]' 1.txt
sed -n '/^[^a-z]/p' 1.txt
显示不以字母开头的行
grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt
sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' 1.txt
grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt
sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' 1.txt
过滤文件中的ip地址
-i 直接修改源文件
比较危险 不要加n 和 p 同时使用
  • -i 直接修改源文件 比较危险 不要加n 和 p 同时使用

sed结合正则使用

/key/ 查找包含关键字的行
/key1/,/key2/ 匹配包含2个关键字之间的行
/key/,x 从匹配关键字的行开始到文件第X行之间的行
x,/kye/ 从文件的第X行开始到与关键字的匹配行之间的行
x,y! 不包含x到y的行
/key/! 不包含关键字的行
sed -n '/root/p' 1.txt
查找包含root的行
sed -n '/^adm/,/^mysql/p' 1.txt
显示在以adm开头的行和以mysql开头的行之间的行
sed -n '/^ftp/,7p' 1.txt
显示以ftp开头的行到文件的第七行
sed -n '/bash$/!p' 1.txt
显示不包含bash$的行
sed -nr '/^lp|^mail/p' 1.txt
显示以lp开头或以mail开头的行

脚本格式

  • 用法
# sed -f scropts.sh file
或者 ./sed.sh file

脚本第一行写
#!/bin/sed -f
1,5d
s/root/hello/g
3i7777
5i8888
a999
p
  • 注意事项
1	脚本文件是一个sed的命令行清单
2	在每行的末尾不能有任何空格 制表符 或其他文本
3	如果一行中有多个命令 应该用分号隔开
4	不需要且不可用引号保护命令
5	#开头的行为注释
  • 举例
# cat sed.sh
#!/bin/sed -f
2a\
*************
#第二行下面加一行********************
2,$s/stu/user/
#第二行到最后一行的stu都改为user
$a\
i love you
#最后一行下面加一行 i love you
s/^[a-z].*/#&/
#搜索以字母开头的行 前面加#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值