sed命令

sed基本用法 Stream Editor 流式编辑器
非交互,基于模式匹配过滤及修改文本
逐行处理,并将结果输出到屏幕
可实现对文本的输出、删除、替换、复制、剪切、导入、导出等
主要用法
–格式:前置命令 | sed [选项] ‘编辑指令’
–格式:sed [选项] ‘编辑指令’ 文件…
set -n ‘/^id/p’ /etc/inittab //列出以id开头的行
sed命令的常用选项如下:
-n (屏蔽默认输出,默认sed会输出读取文档的全部内容)
-r (让sed支持扩展正则)
-i (sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响)
用sed输出/etc/hosts的第1行:
sed - n ‘1p’ /etc/hosts
打印passwd第3到第6行账户的信息
sed - n ‘3,6p’ /etc/passwd
用分号来隔离多个操作
sed - n ‘1p; 4p’ /etc/passwd
直接删除test.txt(自行创建一个任意内容的文件)的第1~4行
sed - i ‘1,4d’ test.txt
####################################
认识sed工具的条件
sed [选项] ‘条件指令’ 文件… …
sed命令可以使用行号或正则做为条件匹配:
1)行号案例
打印第3行
sed - n ‘3p’ /etc/passwd
打印第3到5行:
sed - n ‘3,5p’ /etc/passwd
打印第3和5行
sed - n ‘3p; 5p’ /etc/passwd
打印第3以及后面的10行:
sed - n ‘3,+10p’ /etc/passwd
打印奇数行:
sed - n ‘1~2p’ /etc/passwd
打印偶数行:
sed - n ‘2~2p’ /etc/passwd
2)正则案例
打印包含root的行
sed - n ‘/root/p’ /etc/passwd
打印bash结尾的行
sed - n ‘/bashKaTeX parse error: Expected 'EOF', got '#' at position 58: …p' /etc/passwd #̲###############…=’ a.txt //输出文件的行数
2)下面看看sed工具的d指令案例集锦(自己提前生成一个a.txt文件)
sed ‘3,5d’ a.txt //删除第3~5行
sed ‘/xml/d’ a.txt //删除所有包含xml的行
sed ‘/xml/! d’ a.txt //删除不包含xml的行,! 符号表示取反
sed ‘/^install/d’ a.txt //删除以install开头的行
sed ‘KaTeX parse error: Expected group after '^' at position 30: …文件的最后一行 sed '/^̲/d’ a.txt //删除所有空行
3)sed命令的s替换基本功能(s/旧内容/新内容/选项):
vim test.txt //新建素材
2017 2011 2018
2017 2017 2024
2017 2017 2017
sed ‘s/2017/xxxx/’ test.txt //把每行的第一个2017替换xxxx
sed ‘s/2017/xxxx/g’ test.txt //把每行所有的2017替换xxxx
sed ‘s/2017/xxxx/2’ test.txt //把每行的第二个2017替换xxxx
sed ‘s/2017//2’ test.txt //把每行的第二个2017替换为空
sed - n ‘s/2017/xxxx/p’ test.txt //有-n不显示输出,后加p只显示修改的(适用内容众多)
4)下面看看sed工具的s指令案例集锦(自己提前生成一个a.txt文件)
注意:替换操作的分隔“/”可改用其他字符,如#、&等,便于修改文件路径
sed ‘s/xml/XML/’ a.txt //将每行中第一个xml替换为XML
sed ‘s/xml/XML/3’ a.txt //将每行中的第3个xml替换为XML
sed ‘s/xml/XML/g’ a.txt //将所有的xml都替换为XML
sed ‘s/xml//g’ a.txt //将所有的xml都删除(替换为空串
sed ‘s#/bin/bash#/sbin/sh#’ a.txt //将/bin/bash替换为/sbin/sh
sed ‘4,7s/^/#/’ a.txt //将第4~7行注释掉(行首加#号)
sed ‘s/^#an/an/’ a.txt //解除以#an开头的行的注释(去除行首的
################################
本小节的操作使用nssw.txt作为测试文件
1)删除文件中每行的第二个、最后一个字符
分两次替换操作,第一次替换掉第2个字符,第二次替换掉最后一个字符:
sed ‘s/.//2 ; s/.$//’ nssw.txt 或者
sed -r ‘s/^(.)(.)(.)(.) $/\1\4\3\2/’ nssw.txt
2)将文件中每行的第一个、倒数第1个字符互换
每行文本拆分为“第1个字符”、“中间的所有字符”、“倒数第1个字符”三个部分,然后通过替换操作重排顺序为“3-2-1”:
sed - r 's/^( .) ( .
) ( .) KaTeX parse error: Expected 'EOF', got '\3' at position 2: /\̲3̲\2\1/' nssw.txt…a 192.168.4.5 sv r5.tarena.com sv r5’ /etc/hosts
################################
sed综合脚本应用
本案例要求编写脚本getupwd.sh,实现以下需求:
找到使用bash作登录Shell的本地用户
列出这些用户的shadow密码记录
按每行“用户名 --> 密码记录”保存到getupwd.log,
vim ./getupwd.sh
#/bin/bash
A= ( s e d − n ′ / b a s h ( sed - n '/bash (sedn/bash/s/.: //p’ /etc/passwd) //提取符合条件的账号记录
for i in A d o p a s s 1 = A do pass1= Adopass1=(grep i / e t c / s h a d o w ) p a s s 2 = i /etc/shadow) pass2= i/etc/shadow)pass2={pass1#
:}
pass=KaTeX parse error: Expected '}', got 'EOF' at end of input: …ss2%%:*} echo "i – > KaTeX parse error: Expected 'EOF', got '#' at position 12: pass" done #̲###############…a[common]\n path = /common’ /etc/samba/smb.conf
例、把/etc/passwd文件中以/bin/bash结尾行保存为/tmp/blist
sed -n ‘//bin/bash$/w /tmp/blist’ /etc/passwd
例、使用sed修改/etc/postfix/main.cf文件,把mydestination行的=后的内容清空
sed -i '/^mydest/cmydestination = ’ /etc/postfix/main.cf

sed -r ‘/^mydest/s/(mydestination = ).*/\1/’ /etc/postfix/main.cf | grep ^mydest
例、使用sed修改/etc/resolv.conf文件,在第1行之前插入“nameserver 172.40.1.10”
sed ‘1i nameserver 172.40.1.10’ /etc/resolv.conf
#############################
sed 复制剪切
模式空间
–存放当前处理的行,将处理结果输出
–若当前行不符合处理条件,则原样输出
–处理完当前行再读入下一行来处理
保持空间
–作用类似于"剪贴板"
–默认存放一个空行( 换行符 \n )
基本动作
H : 模式空间—[追加]—保持空间 复制
h : 模式空间—[覆盖]—保持空间 复制
G : 保持空间—[追加]—模式空间 粘贴
g : 保持空间—[覆盖]—模式空间 粘贴

练习:

  1. 提取/etc/passwd文件前5行,增加行号保存为a.txt
    head -5 /etc/passwd | cat -n > a.txt
  2. 将文件a.txt的第1~2行复制到文件末尾
    先复制第1行到剪贴板(覆盖默认的空行),然后复制第2行(追加到员有内容之后),到最后一行时粘贴(追加到末尾)
    sed ‘1h;2H;$G’ a.txt
  3. 将文件a.txt的第1行剪切到第4行后
    先复制第1行到剪贴板(覆盖默认的空行),然后删除第1行;到第4行时粘贴(追加)
    sed ‘1h;1d;4G’ a.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值