Linux下sed命令使用


1. Sed简介

      sed是一种在线流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出,个人认为这是sed的一个很大的特点,对文件不具有破坏性,另外sed还是非交互式的。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。使用sed和正则表达式结合使用,反映了sed的强大功能。

2. 调用sed 命令有两种模式

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
    sed命令功能强大,用法灵活,一个命令如果功能强大,使用灵活的话基本就说明他有着很多的可选命令。sed也是一样,有着大量的可选命令。在这里我只演示一些sed命令的常用,基本的实例,让大家更容易快速理解sed的工作原理及使用。在本文的章节3 、4部分我会列出sed命令的可选命令及含义。

2.1. sed命令实例

     通过以下的实例会让我们更快速理解sed的使用。initdbq.ora文件是本文所有实例的测试文件,并且在这个文件中增加了行号,能让我们更容易理解sed的工作方式。
环境准备:

[root@db10g1 sed]# cat initdbq.ora 
1 dbq.__large_pool_size=4194304
2 dbq.__shared_pool_size=83886080
3 dbq.__streams_pool_size=0
4 *.audit_file_dest='/u01/app/oracle/admin/dbq/adump'
5 *.background_dump_dest='/u01/app/oracle/admin/dbq/bdump'
6 *.compatible='10.2.0.5.0'
7 *.db_block_size=8192
8 *.db_file_multiblock_read_count=64
9 *.db_name='dbq'
10 *.dispatchers='(PROTOCOL=TCP) (SERVICE=dbqXDB)'
11 *.job_queue_processes=10
12 *.open_cursors=300
13 *.pga_aggregate_target=94371840
14 *.processes=150
15 *.sga_target=285212672
16 *.undo_management='AUTO'
17 *.undo_tablespace='UNDOTBS1'

2.1.1. 查询带有字符串为sga的行
选项 –n:sed命令相关的操作。
命令 p:打印到屏幕。
[root@db10g1 sed]# sed -n '/sga/p' initdbq.ora 
15 *.sga_target=285212672
2.1.2. 删除第4行
命令 d:删除
[root@db10g1 sed]# sed '4d' initdbq.ora 
1 dbq.__large_pool_size=4194304
2 dbq.__shared_pool_size=83886080
3 dbq.__streams_pool_size=0
5 *.background_dump_dest='/u01/app/oracle/admin/dbq/bdump'
6 *.compatible='10.2.0.5.0'
7 *.db_block_size=8192
8 *.db_file_multiblock_read_count=64
9 *.db_name='dbq'
10 *.dispatchers='(PROTOCOL=TCP) (SERVICE=dbqXDB)'
11 *.job_queue_processes=10
12 *.open_cursors=300
13 *.pga_aggregate_target=94371840
14 *.processes=150
15 *.sga_target=285212672
16 *.undo_management='AUTO'
17 *.undo_tablespace='UNDOTBS1'
2.1.3. 删除空行
[root@db10g1 sed]# sed /^$/d initdbq.ora

2.1.4. 删除从第3行到最后一行
命令 $:最后一行
[root@db10g1 sed]# sed '2,$d' initdbq.ora 
1 dbq.__large_pool_size=4194304


2.1.5. 删除带有dbq的行
[root@db10g1 sed]# sed '/dbq'/d initdbq.ora 
6 *.compatible='10.2.0.5.0'
7 *.db_block_size=8192
8 *.db_file_multiblock_read_count=64
11 *.job_queue_processes=10
12 *.open_cursors=300
13 *.pga_aggregate_target=94371840
14 *.processes=150
15 *.sga_target=285212672
16 *.undo_management='AUTO'
17 *.undo_tablespace='UNDOTBS1'
2.1.6. 全局替换dbq为dba
参数s:替换
参数g:全局
[root@db10g1 sed]# sed -n 's/dbq/dba/g'p initdbq.ora 
1 dba.__large_pool_size=4194304
2 dba.__shared_pool_size=83886080
3 dba.__streams_pool_size=0
4 *.audit_file_dest='/u01/app/oracle/admin/dba/adump'
5 *.background_dump_dest='/u01/app/oracle/admin/dba/bdump'
9 *.db_name='dba'
10 *.dispatchers='(PROTOCOL=TCP) (SERVICE=dbaXDB)'

2.1.7. 全局替换以数字空格dbq字符串为abc,并打印到屏幕

-n选项与p命令一般为同时出现,意思为只显示那个改变了的行
[root@db10g1 sed]# sed -n 's/^[0-9] dbq/abc/'gp initdbq.ora 
abc.__large_pool_size=4194304
abc.__shared_pool_size=83886080
abc.__streams_pool_size=0
2.1.8. 替换数字285212672为285212672M
参数 &:意思为原操作字符串
[root@db10g1 sed]# sed -n 's/285212672/&M/gp' initdbq.ora 
15 *.sga_target=285212672M
2.1.9. 显示db_block到db_name之间的行
[root@db10g1 sed]# sed -n '/db_block/,/db_name/'p initdbq.ora 
7 *.db_block_size=8192
8 *.db_file_multiblock_read_count=64
9 *.db_name='dbq'
2.1.10. –e选项允许在同一行里执行多条命令
第一个-e选项是将dbq替换为aaa。第二个-e是将第4行到最后一行全部删除
[root@db10g1 sed]# sed -e 's/dbq/aaa/g' -e '4,$d' initdbq.ora 
1 aaa.__large_pool_size=4194304
2 aaa.__shared_pool_size=83886080
3 aaa.__streams_pool_size=0
2.1.11. r命令可从文件读取
使用r命令从abc.txt文件中读取并添加到dbq的下行
[root@db10g1 sed]# sed '/dbq/r abc.txt' initdbq.ora 
1 dbq.__large_pool_size=4194304
hi,i am dba
2 dbq.__shared_pool_size=83886080
hi,i am dba
。。。。。。。。。。。省略
2.1.12. 写入文件:w命令
使用此w命令或是重定向就可以修改原文件了
[root@db10g1 sed]# sed '/undo/w undo.txt' initdbq.ora
[root@db10g1 sed]# cat undo.txt 
16 *.undo_management='AUTO'
17 *.undo_tablespace='UNDOTBS1'
2.1.13. 将UNDOTBS1修改为UNDOTBS2并重定向到一个新文件,然后使用mv替换掉原文件
[root@db10g1 sed]# sed 's/UNDOTBS1/UNDOTBS2/g' initdbq.ora > newinitdbq.ora
[root@db10g1 sed]# cat newinitdbq.ora 
1 dbq.__large_pool_size=4194304
2 dbq.__shared_pool_size=83886080
3 dbq.__streams_pool_size=0
4 *.audit_file_dest='/u01/app/oracle/admin/dbq/adump'
5 *.background_dump_dest='/u01/app/oracle/admin/dbq/bdump'
6 *.compatible='10.2.0.5.0'
7 *.db_block_size=8192
8 *.db_file_multiblock_read_count=64
9 *.db_name='dbq'
10 *.dispatchers='(PROTOCOL=TCP) (SERVICE=dbqXDB)'
11 *.job_queue_processes=10
12 *.open_cursors=300
13 *.pga_aggregate_target=94371840
14 *.processes=150
15 *.sga_target=285212672
16 *.undo_management='AUTO'
17 *.undo_tablespace='UNDOTBS2'
[root@db10g1 sed]# mv newinitdbq.ora initdbq.ora 
mv: overwrite `initdbq.ora'?
2.1.14. 使用-i选项修改原文件
[root@db10g1 sed]# sed -i 's/UNDOTBS1/UNDOTBS2/g' initdbq.ora

2.1.15. i插入新行

[root@db10g1 sed]# sed '/1 dbq/i\----------new line -----' initdbq.ora 
----------new line -----
1 dbq.__large_pool_size=4194304

2.2. sed脚本

Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常严格,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
使用脚本方式在db_name行追加新的一行。

[root@db10g1 sed]# cat sed.sed 
#!/bin/sed -f
/db_name/ a\
hp linux
[root@db10g1 sed]# chmod u+x sed.sed
[root@db10g1 sed]# ./sed.sed initdbq.ora

3. 选项

-e command, –expression=command
允许多台编辑。
-h, –help
打印帮助,并显示bug列表的地址。
-n, –quiet, –silent
取消默认输出。
-f, –filer=script-file
引导sed脚本文件名。
-V, –version
打印版本和版权信息。
4. sed命令
a\
在当前行后面加入一行文本。
b lable
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
c\
用新的文本改变本行的文本。
d
从模板块(Pattern space)位置删除行。
D
删除模板块的第一行。
i\
在当前行上面插入文本。
h
拷贝模板块的内容到内存中的缓冲区。
H
追加模板块的内容到内存中的缓冲区
g
获得内存缓冲区的内容,并替代当前模板块中的文本。
G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l
列表不能打印字符的清单。
n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p
打印模板块的行。
P(大写)
打印模板块的第一行。
q
退出Sed。
r file
从file中读行。
t label
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file
写并追加模板块到file末尾。
W file
写并追加模板块的第一行到file末尾。
!
表示后面的命令对所有没有被选定的行发生作用。
s/re/string/
用string替换正则表达式re。
=
打印当前行号码。
#
把注释扩展到下一个换行符以前。
以下的是替换标记
g表示行内全面替换。
p表示打印行。
w表示把行写入一个文件。
x表示互换模板块中的文本和缓冲区中的文本。
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值