shell脚本基础(sed工具)

sed --stream editor
编辑器的分类:
1、行编辑器
ed 升级版:sed
2、全屏编辑器
vi vim gedit emacs nano

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。(通过非交互式来修改文本中的内容)

1、常用模式:

命令行模式 sed ‘’ file
脚本模式 sed -f sed.txt file
建议使用 ./sed.sh
脚本的第一行写上
#!/bin/sed -f

命令行模式:

格式:sed [options] ‘command’ file(s)

$ sed '10s/:/?/' /etc/passwd 

options 部分(命令行标志)
-n 不输出所有的行,只复制 p 函数或在 s 函数之后 p 标志所指定的行
-e 下一个参数接受为编辑命令,允许多项编辑,如只传递一个编辑命令给sed,可以省略
-i 直接修改目标文件(如无此标志则只显示操作结果到标准输出)
-f 将下一个参数作为脚本文件名处理,此脚本文件应该是包含分行的sed命令
-r 匹配扩展型的正则表达式

command 部分:[地址1,地址2][函数][参数]
1、地址是可以忽略的,一般情况下[地址1]是起始地址,[地址2]是结束地址
2、可以用任何数目的空格或制表符(tab)键把地址和函数分割开来
3、函数必须出现
4、依据给定的不同函数,组成command的标记某些必须,某些可选
5、引用shell script中的变量应使用双引号,而非通常使用的单引号
sed “s/local/$USER/gp” /etc/hosts

+++++++++++++++++++++++++++++
sed文本定位方法

x x为指定行号
x,y 指定从x到y的行号范围
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 从与pattern的匹配行到x号行之间的行
x,/pattern/ 从x号行到与pattern的匹配行之间的行
x,y! 查询不包括x和y行号的行
++++++++++++++++++++++++++++++

$ sed -n '1p' /etc/passwd
$ sed -n '1,2p' /etc/passwd
$ sed -n /root/p /etc/passwd
$ sed -n '/root/=' /etc/passwd
$ sed -n -e '/root/p' -e '/root/=' /etc/passwd
$ sed '/root:/a\we append a new line.' /etc/passwd |head -2
$ sed  '/^root:/ i #我是谁?'   
$ sed -n '10s/:/?/p' /etc/passwd 
$ sed  's/[0-9]//g'  /etc/passwd 
$ sed -nr '10s/[0-9]|:|\///pg' /etc/passwd

sed 匹配元字符

$ sed -n '/\./p' /etc/passwd
$ sed -n '/\$/p' /etc/shadow
$ sed -n '5,$s/root/123/p'  passwd 

使用元字符进行匹配

$ sed -n '$p' /etc/passwd
$ sed -n '$'p /etc/passwd	
$ sed -n '/.*uu/p' /etc/passwd
$ sed -n '2,10p' /etc/passwd
$ sed -n -e '2,10p' -e  '2,10=' /etc/passwd
$ sed -n '/uu05/,$p' /etc/passwd
$ sed -n '/root/,10p' /etc/passwd
$ sed -n '3,/root/p' /etc/passwd

脚本模式:

脚本文件是一个sed的命令行清单
在每行的末尾不能有任何空格、制表符(tab)或其它文本
如果在一行中有多个命令,应该用逗号分隔
不需要且不可用引号保护命令
#号开头的行为注释

vim insert.sed
#!/bin/sed -f
/root:/i \
We insert a new line.
$ ./insert.sed /etc/passwd |head

2、操作定位(数字(行号)、正则表达式或两者结合)

查找:

$ sed -n '/root/p' /etc/passwd	
$ sed -n '/^root/p' /etc/passwd
$ sed -n '1p' /etc/passwd
$ sed -n '1,3p' /etc/passwd

1)十进制数字
例如:sed ‘1d’ file
例如:sed ‘1,10s/foo/bar/’ file
sed ‘s/foo/bar/’ file

$ sed 's/o/@/3'  grep.txt 
ggle
gogle
google
goo@gle
gagle
gaagle
gaaagle
abcgef

2)正则表达式
正则表达式必须以”/“前后规范间隔
例如:sed ‘/foo/d’ file
例如:sed ‘/^foo/d’ file

如果匹配的是扩展正则表达式,需要使用-r选来扩展sed

$ sed -r -n 's/(([0-9]){1,3}\.){3}([0-9]){1,3}/IPIP/gp' /var/log/secure
$ sed -i -r  '/^#|^$/d'  /var/tmp/vsftpd.conf    == egrep -v '^#|^$' /var/tmp/vsftpd.conf 
$ sed -r -n -e 's/(([0-9a-zA-Z]{1,2}\:){5}[0-9a-zA-Z]{1,2})//g'  -n -e 's/(([0-9]){1,3}\.){3}([0-9]){1,3}/IPIP/gp'   mac.out 

在正则表达式中如果出现特殊字符(^$.*/[]),需要以前导 ”\“ 号做转义
例如:sed ‘/$foo/p’ file

3)逗号分隔符
例如:sed ‘5,7d’ file
例如:sed ‘/foo/,/bar/d’ file --删除第一个匹配字符串"foo"到第一个匹配字符串"bar"的所有行本行不找 循环执行
sed -n ‘/^root/,/uucp/d’ /etc/passwd

4)组合方式
例如:sed ‘1,/foo/d’ file --删除第一行到第一个匹配字符串"foo"的所有行
例如:sed ‘/foo/,+4d’ file --删除从匹配字符串”foo“开始到其后四行为止的行
例如:sed ‘/foo/,~3d’ file --删除从匹配字符串”foo“从文本开始删除到第3行
例如:sed ‘1~5d’ file --从第一行开始每五行删除一行
例如:sed -n ‘/foo|bar/p’ file --显示配置字符串"foo"或"bar"的行
sed -n ‘/foo/,/bar/p’ file 显示匹配从foo到bar的行
sed ‘1~2d’ file --删除奇数行
sed ‘0-2d’ file --删除偶数行 sed ‘1~2!d’ file

5)特殊情况
例如:sed ‘$d’ file --删除最后一行
sed ‘1d’ file
正则表达式的操作:
sed ‘s/.//’ a.txt --删除每一行中的第一个字符
sed ‘s/.//2’ a.txt --删除每一行中的第二个字符
sed ‘s/.$//’ a.txt --删除每一行中的最后一个字符
(you) your

3、函数

替换/删除/修改/追加/插入

1)替换
sed ‘s/aaa/AAA/gp’ file

2)追加新行(a)
sed ‘/^root/a input your newline’ /etc/passwd
–在文件中搜索以root开头的行,然后在这一行后追加一个新行,内容是:input your newline
sed ‘/^root/a\ input your newline’ /etc/passwd

sed ‘5a hello all’ /etc/passwd | nl
–在第5行后追加新行变成第6行,内容…

sed ‘$a hello all’ /etc/passwd
–在最后一行的追加一行成为新的最后一行

3)插入:
sed ‘/^root/i input your newline’ /etc/passwd |nl --在root上一行
sed ‘5i hello all’ /etc/passwd | nl --插入成为第五行
sed ‘$i hello all’ /etc/passwd --倒数第二行

4)修改(&),追加关键字:
sed ‘s/root/&aa/g’ /etc/passwd --搜索包含root,在原来的基本上加上aa变以rootaa
sed ‘s/root/& aa/g’ /etc/passwd --搜索包含root,在原来的基本上加上 aa变以root aa
sed ‘1,10s/root/& aa/g’ /etc/passwd
sed ‘10s/root/&aa/g’ /etc/passwd
sed ‘10s/root/aa&/g’ /etc/passwd
sed -r ‘s/([0-9]{1,3}.){3}[0-9]{1,3}/& :DENY/g’ /etc/hosts.deny
sed -r ‘s/([0-9]{1,3}.){3}[0-9]{1,3}/ :DENY &/g’ /etc/hosts.deny
sed -r ‘s/[a-zA-Z]+/@&.net/’ t2 替换文本中的任意单词为@[a-zA-Z].net

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值