|
|
December 06 __//在这安静的时刻, 心情的惆怅和疲惫的身体都不成为一体, 好象感觉分离开好久了,不知不觉中分离! 赶着下班的时间同事们都离开了公司,诺大的公司里现在没几个人了,我独自坐在电脑旁, 整个部门除了二部老大在,我这边只剩我一个人咯~!此刻公司里显现的是那么的安静, 给人有些想象的空间; 于是就静静地想写下这些天: 空乏浮躁疲惫的心情, 在那一刻真的想的很掺~!(理由是公司的抽验考试,考的是项目集成实施,哈哈..现在想的有点可笑).
__// 当时做的头很疼,皮肤很苍老,连胡子都拉碴了~(因为好久没学习也没看文档没做实验,差点都不认识它了!所以瞅着有点迷茫~!)!当时那些天憔悴的心理和身体,真有放弃了的想法~ 接连好几天的赶忙, 弥补围城一样的感觉! 难受,压抑...... 同时还让好朋友们担心~!真不是滋味. 今天终于有了缓和的机会,放松了下这些天忙的要死的身体~! 文档都整理的差不多了,仔细想想, 这样的考验,类似的突击真的能给我们带来很好的效果~!
__//同时还可以让我们了解到自己都干了些什么,要么继续这样的闲暇的生活真的会让人因空虚而死亡~! 想想当时的担心其实也是多余的, 反而更能让自己的缺点和不足得到大大的暴露,这样才不能有浮躁的坏性格,才不会有偶尔的侥幸心理,也不可能有更多闲暇的时间去浪费~!这些天的紧张的补缺,才发觉在这之前的那些天自己好象什么都没干似的,很无庸~!
__//时刻告急自己,学习不是一刻的努力,要时刻记得,工作更是!由于前段时间的不警惕才导致现在的紧张突击; 另外也给自己一个警告: 浮躁的性格要开始改变,侥幸的心理时刻要克服,在每一个时刻都要用心去做, 不管学习还是工作,到此发出呼应: 不是世道的不公平,没有谁对你怎么的想法;做自己从现在开始,不再庸俗不再浮躁不再偶尔侥幸每时每刻不再把太多的闲暇时间用来浪费, 要偶尔学习拉~!哈哈哈,从今天开始警觉,从今天开始点点滴滴改掉坏的毛病,哈哈,让好朋友们担心了,特此在公告里警觉~!
__//这样写的很稚气,不要笑我孩子气~! 这样我紧张的心才能很放松, 很放松~! 同时也告知我亲爱的朋友们我没事的,相信我~!前些天的不连断的电话让你们担心了~! 明天开始牛会心情好癜了拉.. 哈哈, 疯癫的癜~! 哈哈哈哈哈......
此致 那个敬礼, 拜拜今天...
__//此致 那个敬礼...我马上就要收马赶车回家吃饭了...
___//此致..那个敬礼..好朋友们明天好心情..
_____//此致..那个敬礼..... ∑∩ぉォΘ骂我那个疯拉......
__//-- 2007-12-05 22:45 -- 现在已经在家了 December 05 ---/////------\\\\\\-----神州泰岳数据库-ULTRANMS/ULTRANMS-----/////------\\\\\-----------------
第一步: 准备好脚本 ddl_ora(all).txt 和 dml(all).txt 这两个sql脚本一般存放在ultranms安装目录下: ..\ultrapower\server\db\oracle 文件夹下.
具体使用步骤如下: unix 系统需先: su -oracle windows系统则直接如下命令:
1)cmd => cd\ => cls => sqlplus /nolog __//登陆到数据库, 2)sql>conn sys as sysdba; __//使用sys用户__执行ddl脚本, 3)sql>@E:\ultrapower\server\db\oracle\ddl_ora(all).txt __//执行脚本ddl,用于创建ultranms用户和数据库, 4)sql>conn ultranms/ultranms; __//使用ultranms连接ultranms库, 5)sql>@E:\ultrapower\server\db\oracle\dml(all).txt __//执行脚本dml,来生成ultranms库里的数据
6)sql>Drop user username cascade; __//用于行命令删除用户_重建ulranms数据库使用
------------------------------------------------------------------------------------------------------------------------ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ------------------------------------------------------------------------------------------------------------------------ \\\\\\\\\---- 服务端启动ultranms的先后顺序和注意事项 ----/////////
注意: 目录文件在ultranms的安装路径下, 如 ..\ultrapower 下的server端和probe端两个文件夹下:
server端文件夹下,bin文件下: 1)setenv.bat ___//查看下java的路径是否正确
2)startMsgServer.bat ___//首先要启动的服务......
3)startServer.bat ___//接着启动server服务.......
probe端, bin文件夹下: 1)setenv.bat ___//查看java的环境变量的路径是否正确 2)confignms.bat ___//查看配置的端口,以及ultranms服务所在的ip和数据库ip是否正确
1)在所在系统的浏览器中输入: http://ultranms安装系统的ip:58080 回车 ___//58080端口是自己设置的ultranms的默认端口号. 2)然后会弹出客户端界面, 下载安装客户端, 然后输入 ultranms的ip; 用户名: root 密码:123 选择需要语言登陆便可.
--------------------------------------------------------------------------------------------------------------- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ---------------------------------------------------------------------------------------------------------------
------------------///////--\\\\\\\patrol install to unix//////--\\\\\\\\------------------------------------ 确定一下是在何种系统上安装,是否有数据库,是否是AIX系统,由于这些原因需要在新建用户时同时加入到不同属主, 代理主机上有: 1)oracle: dba组; 2)oracle双机: oinstall组; 3)AIX: adm组; 4)patrol所属属主: bmc组; 添加用户和组, AIX下可以使用smitt命令图形用户管理; 首先看看系统类型: #uname -a 接着: 是否是在超级用户root下: #id 接下来查看shell类型: #env 然后在看看cpu利用率等等: #top #vmstat 3 10 #sar 2 5 #mpstat 3 7 etc. 1)#mkgroup -g 890 bmc ___//新建一个组id为890的组bmc
2)#mkuser -u 891 -g 890 -G oinstall -G adm -d /opt/bmc -m -s /bin/sh patrol ___//新建一个uid 891 gid 890用户patrol,同时属于890,oinstall,adm三组,所属目录指定新建到/opt/bmc目录下,指定shell类型为普通sh; 3)#passwd patrol ___//给新建的用户赋予密码为patrol 4)#chown patrol:bmc /opt/bmc ___//更改下目录/opt/bmc的属主为bmc 这一部看情况,如果上面执行结果相同那就是多余.
5)#chmod 755 /opt/bmc ___//更改下/opt/bmc读写执行权限
6)___///接着,查看是否新建的用户可以su到root; 可以的话接下来安装,安装结束后. #../setup.sh -serveronly -host_override ( 后跟代理主机ip) 接着在ie或则别的浏览器中输入: http://代理主机ip:50001 开始安装..... 7)__///安装结束,vi编辑环境变量:
#cd $HOME #vi .profile
cd /opt/bmc/Patrol3 . ./patrolrc.sh PATH=/opt/bmc/Patrol3:$PATH export PATH umask 022 ulimit –n 256
8)___///199端口被站用的情况下,在patrol上更改端口199为8199方法:
OS>%PSL print(get("/snmp/smux_port")); 199 <== Verify that current configuration is 199 OS>%PSL pconfig("REPLACE","/snmp/smux_port","8199"); OS>%PSL print(get("/snmp/smux_port")); 8199 <== Verify that new configuration is 8199
9)___//更改patrolagent的团体名和系统snmp团体名相同
November 23
最后为了展示 g 标志的效果,命令:
/X/s/an/AN/p
生成(假定不复制模式):
In XANadu did Kubhla Khan
而命令:
/X/s/an/AN/gp
生成:
In XANadu did Kubhla KhAN
3.3. 输入输出函数(2)p -- print
打印函数把寻址到的行写到标准输出文件。在遇到 p 函数的时候就写入它们,而不管后续的编辑命令对这些行会做些什么。 (2)w <文件名> -- write on <filename>
写函数把寻址到的行写到<文件名>指名的文件中。如果这个文件以前就存在,则覆盖它;否则,就建立它。每行都按遇到写函数时现存的样子写入,而不管后续的编辑命令对这些行会做些什么。必须用精确的一个空格分隔 w 和<文件名>。在 s 函数的 w 标志之后和写函数中可以提及的不同的文件名字合起来的最大数目为 10 个。 (1)r <文件名> -- read the contents of a file
读函数读入<文件名>的内容,并把它们添加到匹配这个地址的行的后面。读取这个文件并添加它的内容,而不管后续的编辑命令对匹配它的地址的这些行会做些什么。如果 r 和 a 函数在同一行上执行,来自 a 函数和 r 函数的文本按照这些函数执行的次序写入输出。必须用精确的一个空格分隔 r 和<文件名>。如果 r 函数提及的文件不能打开,它被当作一个空文件,而不是一个错误,所以不给出诊断信息。
注意: 因为对可以同时打开的文件数目是有所限制的,要小心在 w 命令或标志中不要提及多于 10 个(不同的)文件;如果有任何 r 函数出现,这个数目还会再减少一个。(在一个时候只能打开一个读取文件)。
例子
假定文件‘note1’有如下内容:
Note: Kubla Khan (more properly Kublai Khan; 1216-1294) was the grandson and most eminent successor of Genghiz (Chingiz) Khan, and founder of the Mongol dynasty in China.
则下列命令: /Kubla/r note1
生成:
In Xanadu did Kubla Khan
Note: Kubla Khan (more properly Kublai Khan; 1216-1294) was the grandson and most eminent successor of Genghiz (Chingiz) Khan, and founder of the Mongol dynasty in China.
A stately pleasure dome decree:
Where Alph, the sacred river, ran
Through caverns measureless to man
Down to a sunless sea.
3.4. 多输入行函数
有三个用大写字母拼写的函数特殊处理包含内嵌换行的模式空间;它们主要意图提供跨越输入中的行的模式匹配。 (2)N -- Next line
在模式空间中把下一行添加到当前行之后;两个输入行用一个内嵌的换行分隔。模式匹配可以延伸跨越这个内嵌换行。 (2)D -- Delete first part of the pattern space
删除当前模式空间中直到并包括第一个换行字符的所有字符。如果这个模式空间变成了空的(唯一的换行是终止换行),则从输入读取另一行。在任何情况下,都再次从编辑命令列表的起始处开始执行。 (2)P -- Print first part of the pattern space
打印模式空间中的直到并包括第一个换行的所有字符。
P 和 D 函数等价于它们对应的小写函数,如果在模式空间中没有内嵌换行的话。
3.5. 保存和取回函数
有四个函数为将来的使用而保存和取回部分输入。 (2)h -- hold pattern space
h 函数把模式空间的内容复制到保存区域(销毁保存区域以前的内容)。 (2)H -- Hold pattern space
H 函数把模式空间的内容添加到保存区域的内容之后;以前和新的内容用换行分隔。 (2)g -- get contents of hold area
g 函数把保存区域的内容复制到模式空间(销毁模式空间以前的内容)。 (2)G -- Get contents of hold area
G 函数把保存区域的内容添加到模式空间的内容之后;以前和新的内容用换行分隔。 (2)x -- exchange
对换命令交换模式空间和保存区域的内容。
例子
命令
1h
1s/ did.*//
1x
G
s/\n/ :/
应用于我们的标准例子,生成:
In Xanadu did Kubla Khan :In Xanadu
A stately pleasure dome decree: :In Xanadu
Where Alph, the sacred river, ran :In Xanadu
Through caverns measureless to man :In Xanadu
Down to a sunless sea. :In Xanadu
3.6. 控制流函数
这些函数不在输入行上做编辑,但是控制函数到地址部分所选择的行的应用。 (2)! -- Don’t
非命令导致(写在同一行上的)下一个命令,应用到所有的且只能是未被地址部分选择到那些输入行上。 (2){ -- Grouping
组合命令‘{’导致下一组命令作为一个块而被应用(或不应用)到组合命令的地址所选择的输入行上。在组合控制下的的命令中的第一个命令可以出现在与‘{’相同的一行或下一行上。
组合的命令由自己独立在一行之上的相匹配的‘}’终止。
组合可以嵌套。 (0):<标号> -- place a label
标号函数在编辑命令列表中标记一个位置,它将来可以被 b 和 t 函数所引用。<标号>可以是八个或更少的字符的任何序列;如果两个不同的冒号函数有相同的标号,就会生成编译时间诊断信息,而不做执行尝试。 (2)b<标号> -- branch to label
分支函数导致应用于当前输入行上的编辑命令序列,被立即重新启动到有相同的<标号>的冒号函数的所在位置之后。如果在所有编辑命令都已经被编译了之后仍没有找到有相同的标号的冒号函数,就会生成一个编译时间诊断信息,而不做执行尝试。
不带有<标号>的 b 函数被当作到编辑命令列表结束处的分支;对当前输入行做应做的无论怎样的处理,并读入其他输入行;编辑命令的列表在这个新行上从头重新启动。 (2)t<标号> -- test substitutions
t 函数测试在当前输入行上是否已经做了任何成功的替换;如果有,它分支到<标号>;否则,它什么都不做。指示已经执行了成功的替换的标志通过如下方式复零:
- 1) 读取一个新输入行,或
- 2) 执行 a 和 t 函数。
3.7. 杂类函数(1)= -- equals
= 函数向标准输出写入匹配它的地址的行的行号。 (1)q -- quit
q 函数导致把当前行写到标准输出(如果应该的话),任何添加的或读入的文本也被写出,而且执行会被终止。
3. 函数
所有函数都用一个单一字符来命名。在下面的总结中,允许地址的最大数目在成对的圆括号内给出,接着的单一字符是函数名字,可能有的参数包围在成对的尖括号(< >)内,单一字符名字的英语解释,并在最后描述每个函数做些什么。在参数外围的尖括号不是参数的一部分,在实际编辑命令中不应该键入。
3.1. 面向整行的函数(2)d -- delete lines
d 函数从文件中删除(不写入输出)匹配它的地址的所有行。
它还有一个副作用,在这个已删除的行上将不再尝试进一步的命令;在执行了 d 之后,马上就从输入读取一个新行,在新行上从头重新启动编辑命令列表。 (2)n -- next line
n 函数从输入读取下一行,替代当前行。当前行被写入输出,如果应该的话。继续执行编辑命令列表在 n 命令之后的部分。 (1)a\
<文本> -- append lines
a 函数导致在匹配它的地址的行之后把参数<文本>写入输出。a 命令是天生多行的;a 必须出现在一行的结束处,而<文本>可以包含任意数目的行。为了保持一行一个命令的构想,内部的换行必须用给换行立即前导上反斜杠字符(‘\’)的方式来隐藏。<文本>参数终止于第一个未隐藏的换行(没有立即前导反斜杠的第一个换行)。
一旦 a 函数成功的执行了,<文本>将被写入输出,而不管后来的命令对触发它的行会做些什么。触发的行可以被完全删除掉;而<文本>仍会被写入输出。
<文本>不被地址匹配所扫描,不尝试对它做编辑命令。它不引起行号计数器的任何变化。 (1)i\
<文本> -- insert lines
i 函数表现得等同于 a 函数,除了<文本>在匹配行之前写入输出之外。关于 a 函数的所有其他注释同样适用于 i 函数。 (2)c\
<文本> -- change lines
c 函数删除它的地址所选择的那些行,并把它们替代为在<文本>中的行。象 a 和 i 一样,c 必须跟随着被反斜杠隐藏了的换行;并且在<文本>中的内部的换行必须用反斜杠隐藏。
c 命令可以有两个地址,所以可选择一定范围内的行。如果找到,在这个范围内的所有行都被删除,只把<文本>的一个复本写入输出,而不是对每个删除的行都写一个复本。同于 a 和 i,<文本>不被地址匹配所扫描,不尝试对它做编辑命令。它不引起行号计数器的任何变化。
在一行已经被 c 函数删除之后,在这个已删除的行上将不再尝试进一步的命令。
如果 a 或 r 函数在某一行之后添加了文本,而这一行随后被 c 函数变更了,则 c 函数所插入的文本将会放置在 a 或 r 函数的文本之前。(r 函数在章节 3.4. 中描述)。
注意: 在这些函数放入输出的文本内,前导的空白和 tab 都会消失,象 sed 的编辑命令一样。要把前导的空白和 tab 放入输出中,需要在想要的第一个空白或 tab 之前前导反斜杠;这个反斜杠不会出现在输出中。
例子:
编辑命令的列表:
n
a\
XXXX
d
应用于我们的标准输入,生成:
In Xanadu did Kubhla Khan
XXXX
Where Alph, the sacred river, ran
XXXX
Down to a sunless sea.
在这个特定情况下,下面两列命令列表会生成同样的效果:
n n
i\ c\
XXXX XXXX
d
3.2. 替换函数
这是一个非常重要的函数,它改变在一行之内通过上下文查找而选择出的这一行的某部分。 (2)s<模式><替代><标志> -- substitute
s 函数替代行的(通过<模式>选择的)某部分为<替代>。它可以读做:
替换<模式>为<替代>
<模式>参数包含一个模式,它完全等同于地址中的模式(参见章节 2.2)。在<模式>和上下文地址之间的唯一区别是上下文地址必须用斜杠字符(‘/’)来界定;<模式>可以用不是空格或换行的任何其他字符来界定。
缺省的,只替换匹配<模式>的第一个字符串,参见后面的 g 标志。
<替代>参数紧接着<模式>的第二个分界字符之后开始,并且它必须立即跟随着分界字符的另一个实例。(所以准确的有三个分界字符的实例)。<替代>不是模式,在模式中有特殊意义的字符在<替代>中没有特殊意义。反而有特殊意义的字符是:
- & 被替代为匹配<模式>的字符串。
- \d (这里的 d 是一个单一的数字)被替代为同<模式>中第 d 个包围在‘\(’和‘\)’内的部分相匹配的子串。如果在<模式>中出现嵌套的子串,第 d 个通过计数开分界符 (‘\(’)来界定。同在模式中一样,特殊字符可以通过前导反斜杠(‘\’)来变为文字。
<标志>参数可以包含任何下列标志:
g -- 把此行中<模式>的所有(不重叠)的实例都替换为<替代>,对<模式>的下一个实例的扫描就开始于插入的 这些字符之后;放置入行中的来自<替代>的字符不会被重新扫描。
p -- 打印此行,如果做了成功替换的话。p 标志导致把输入行写入输出,当且仅当这个 s 函数实际上做了替换。注意如果有多个 s 函数,每个函数都跟随着 p 标志,它们都在同一个输入行上成功的做了替换,会把这一行的多个复本写到输出: 每个成功的替换都写一个复本。
w <文件名> -- 把此行写入一个文件,如果做了成功的替换的话。w 标志导致实际上被 s 函数替代了那些行被写到<文件名>所指名的文件中。如果<文件名>在 sed 运行前就存在,则覆盖它。否则,就建立它。
必须用一个单一的空格分隔 w 和<文件名>。
同 p 一样有着写入一个输入行的多个略有不同的复本的可能性。
在 w 标志和 w 函数(参见后面章节)之后可以提及的不同的文件名字合起来的最大数目为 10 个。
例子:
把下列命令应用于我们的标准输入,
s/to/by/w changes
生成,在标准输出上:
In Xanadu did Kubhla Khan
A stately pleasure dome decree:
Where Alph, the sacred river, ran
Through caverns measureless by man
Down by a sunless sea.
在文件‘changes’中:
Through caverns measureless by man
Down by a sunless sea.
如果不复制选项生效,命令:
s/[.,;?:]/*P&*/gp
生成:
A stately pleasure dome decree*P:*
Where Alph*P,* the sacred river*P,* ran
Down to a sunless sea*P.*
sed - 非交互式文本编辑器
Lee E. McMahon
Bell Laboratories Murray Hill, New Jersey 07974
翻译:寒蝉退士
译者声明:译者对译文不做任何担保,译者对译文不拥有任何权利并且不负担任何责任和义务。 原文:http://cm.bell-labs.com/7thEdMan/vol2/sed
摘要
sed 是在 UNIX ® 操作系统上运行的一个非交互式上下文编辑器。sed 被设计在下列三种情况下发挥作用:
目录
引用
介绍
sed 是一个非交互式上下文(context)编辑器,它被设计在下列三种情况下发挥作用:
1) 编辑那些对舒适的交互式编辑而言太大的文件。2) 在编辑命令太复杂而难于在交互模式下键入的时候编辑任何大小的文件。3) 要在对输入的一趟扫描中有效的进行多个‘全局’(global)编辑函数。
因为每次只把输入的某些行驻留在内存中,并且不使用临时文件,所以可编辑的文件的有效大小,只受限于输入和输出要同时共存于次级存储的要求。
可以单独的建立复杂的编辑脚本并作为给 sed 的命令文件。对于复杂的编辑,这节省了可观的键入和随之而来的错误。从命令文件运行 sed 高效于作者所知道的任何交互式编辑器,甚至包括能用预先写好的脚本驱动的编辑器。
相较于交互式编辑器而言,根本性的损失是缺乏相对地址(由于操作是每次一行的),和缺乏对命令如期运行的立即验证。
sed 是 UNIX 编辑器 ed 的直系后代。由于在交互式和非交互式操作之间的差异,在 ed 和 sed 之间已经有了可观的变化;甚至 ed 的惯常用户都会经常感到惊讶(并可能气愤),如果他们没有阅读本文档的章节 2 和 3,就草率的使用 sed 的话。在两个编辑器之间最显著的家族性共同之处,在于他们所识别的模式(‘正则表达式’)的种类;匹配模式的代码可以从 ed 的代码几乎原封不动的复制过来,在章节 2 中对正则表达式的描述就是从 UNIX Programmer’s Manual[1] 几乎原封不动的复制过来的。(代码和描述都是 Dennis M. Ritchie 写的)。
1. 整体操作
sed 缺省的把标准输入复制到标准输出,在把每行写到输出之前可能在其上进行一个或多个编辑命令。这种行为可以通过命令行上的标志来更改;参见下面的章节 1.1。
编辑命令的一般格式为:
[地址1,地址2][函数][参数]
一个或两个地址是可以省略的;地址的格式在章节 2 中给出。可以用任何数目的空白或 tab 把地址和函数分隔开。函数必须出现;在章节 3 中讨论可用的所有命令。依据给出的是哪个函数,参数可能是必需的或是可选的;它们在章节 3 中每个单独的函数之下讨论。
忽略在这些行开始处的 tab 字符和空格。
1.1. 命令行标志
在命令行上识别三个标志:
- -n:告诉 sed 不复制所有的行,只复制 p 函数或在 s 函数后 p 标志所指定的行(参见章节 3.3)。
- -e:告诉 sed 把下一个参数接受为编辑命令。
- -f:告诉 sed 把下一个参数接受为文件名;这个文件应当包含一行一个的编辑命令。
1.2. 编辑命令的应用次序
在做任何编辑之前(实际上,甚至在打开任何文件之前),所有编辑命令都被编译成了在执行阶段(在把这些命令实际应用于输入文件的行的时候)有适当效率的形式。按它们出现的次序编译这些命令;一般而言这也是在执行时尝试应用它们的次序。这些命令一次应用一个;给每个命令的输入都是所有前面命令的输出。
编译命令应用的缺省的线性次序可以通过控制流命令 t 和 b 来变更(参见章节 3)。即使在应用次序被这些命令改变的时候,给任何命令的输入仍是任何此前应用的命令的输出。
1.3. 模式空间
模式匹配的范围叫做模式空间。一般而言,模式空间是输入文本中某一行,但是可以通过使用 N 命令把多于一行读入模式空间(参见章节 3.6.)。
1.4. 示例
例子分散在正文中。除非特别说明,例子都假定了下列输入文本:
In Xanadu did Kubla Khan
A stately pleasure dome decree:
Where Alph, the sacred river, ran
Through caverns measureless to man
Down to a sunless sea.
(在任何情况下 sed 命令的输出都不能被当作是对 Coleridge 作品的改进。)
例子:
命令
2q
会在复制了输入的前两行之后退出。输出将是:
In Xanadu did Kubla Khan
A stately pleasure dome decree:
2. 地址: 选择要编辑的行
编辑命令要应用于其上的,输入文件中的行可以通过地址来选择。地址可以是行号或者是上下文地址。
通过用花括号(‘{ }’)组合(group)命令,可以用一个地址(或地址对)来控制一组命令的应用(参见章节 3.6.)。
2.1. 行号地址
行号是十进制整数。在从输入读入每一行的时候,增加一个行号计数器;行号地址匹配(选择)导致这个内部计数器等于地址行号的输入行。计数器在多个输入文件上累计运行,在打开一个新文件的时候它不被复零(reset)。
作为特殊情况,字符 $ 匹配输入文件的最后一行。
2.2. 上下文地址
上下文地址是包围在斜杠中(‘/’)的模式(‘正则表达式’)。sed 识别的正则表达式被构造如下:
- 1) 普通字符(不是下面讨论的某个字符)是一个正则表达式,并且匹配这个字符。
- 2) 在正则表达式开始处的‘^’符号(circumflex)匹配在行开始处的空(null)字符。
- 3) 在正则表达式结束处的美元符号‘$’匹配在行结束处的空字符。
- 4) 字符‘\n’匹配内嵌的换行字符,而不是在模式空间结束处的换行。
- 5) 点‘.’匹配除了模式空间的终止换行之外的任何字符。
- 6) 跟随着星号‘*’的正则表达式,匹配它所跟丛的正则表达式的任何数目(包括 0)的毗连出现。
- 7) 在方括号‘[ ]’内的字符串,匹配在字符串内的任何字符,而非其他。但是如果这个字符串的第一个字符是‘^’符号,正则表达式匹配除了在这个字符串内的字符和模式空间的终止换行之外的任何字符。
- 8) 正则表达式的串联(concatenation)是正则表达式,它匹配这个正则表达式的成员所匹配的字符串的串联。
- 9) 在顺序的‘\(’和‘\)’之间的正则表达式,在效果上等同于没有它修饰的正则表达式,但它有个副作用,将在下面的 s 命令和紧后面的规定 10 中描述。
- 10) 表达式‘\d’意味着与在同一个表达式中先前的‘\(’和‘\)’中包围的表达式所匹配的那些字符同样的字符串。这里的 d 是一个单一的数字;指定的字符串是‘\(’的从左至右的第 d 个出现所起始的字符串。例如,表达式‘^\(.*\)\1’匹配开始于同一个字符串的两次重复出现的行。
- 11) 孤立的空正则表达式(就是‘//’)等价于编译的最后一个正则表达式。
要使用特殊字符(^ $ . * [ ] \ /)中的某一个字符作为文字(去匹配输入中它们自身的出现),要对这个特殊字符前导一个反斜杠‘\’。
上下文地址‘匹配’输入要求地址内的整个模式匹配模式空间的某个部分。
2.3. 地址的数目
在下一章节中的命令可能有 0, 1 或 2 个地址。在每个命令中都给出了允许的地址的最大数目。地址多于最大允许个数的命令被认为是错误的。
如果命令没有地址,它应用于输入中每个行。
如果命令有一个地址,它应用于匹配这个地址的所有行。
如果命令有两个地址,它应用于匹配第一个地址的第一行,和直到(并包括)匹配第二个地址的第一个后续行的所有后续行。接着在后续的行上再次尝试匹配第一个地址,并重复这个处理。
两个地址用逗号分隔。
例子:
/an/ 匹配我们样例文本的第 1, 3, 4 行
/an.*an/ 匹配第 1 行
/^an/ 没有匹配行
/./ 匹配所有行
/\./ 匹配第 5 行
/r*an/ 匹配第 1,3, 4 行(number = zero!)
/\(an\).*\1/ 匹配第 1 行
------------------网上摘录-----
- -------------------------------------------------------------------------
SED单行脚本快速参考(Unix 流编辑器) 2005年12月29日
英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) 原标题:HANDY ONE-LINERS FOR SED (Unix stream editor)
整理:Eric Pement - 电邮:pemente[at]northpark[dot]edu 版本5.5 译者:Joe Hong - 电邮:hq00e[at]126[dot]com
在以下地址可找到本文档的最新(英文)版本: http://sed.sourceforge.net/sed1line.txt http://www.pement.org/sed/sed1line.txt
其他语言版本: 中文 - http://sed.sourceforge.net/sed1line_zh-CN.html 捷克语 - http://sed.sourceforge.net/sed1line_cz.html 荷语 - http://sed.sourceforge.net/sed1line_nl.html 法语 - http://sed.sourceforge.net/sed1line_fr.html 德语 - http://sed.sourceforge.net/sed1line_de.html
葡语 - http://sed.sourceforge.net/sed1line_pt-BR.html
文本间隔: --------
# 在每一行后面增加一空行 sed G
# 将原来的所有空行删除并在每一行后面增加一空行。 # 这样在输出的文本中每一行后面将有且只有一空行。 sed '/^$/d;G'
# 在每一行后面增加两行空行 sed 'G;G'
# 将第一个脚本所产生的所有空行删除(即删除所有偶数行) sed 'n;d'
# 在匹配式样“regex”的行之前插入一空行 sed '/regex/{x;p;x;}'
# 在匹配式样“regex”的行之后插入一空行 sed '/regex/G'
# 在匹配式样“regex”的行之前和之后各插入一空行 sed '/regex/{x;p;x;G;}'
编号: --------
# 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符” # (tab,见本文末尾关于'\t'的用法的描述)而不是空格来对齐边缘。 sed = filename | sed 'N;s/\n/\t/'
# 对文件中的所有行编号(行号在左,文字右端对齐)。 sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
# 对文件中的所有行编号,但只显示非空白行的行号。 sed '/./=' filename | sed '/./N; s/\n/ /'
# 计算行数 (模拟 "wc -l") sed -n '$='
文本转换和替代: --------
# Unix环境:转换DOS的新行符(CR/LF)为Unix格式。 sed 's/.$//' # 假设所有行以CR/LF结束 sed 's/^M$//' # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V sed 's/\x0D$//' # ssed、gsed 3.02.80,及更高版本
# Unix环境:转换Unix的新行符(LF)为DOS格式。 sed "s/$/`echo -e \\\r`/" # 在ksh下所使用的命令 sed 's/$'"/`echo \\\r`/" # 在bash下所使用的命令 sed "s/$/`echo \\\r`/" # 在zsh下所使用的命令 sed 's/$/\r/' # gsed 3.02.80 及更高版本
# DOS环境:转换Unix新行符(LF)为DOS格式。 sed "s/$//" # 方法 1 sed -n p # 方法 2
# DOS环境:转换DOS新行符(CR/LF)为Unix格式。 # 下面的脚本只对UnxUtils sed 4.0.7 及更高版本有效。要识别UnxUtils版本的 # sed可以通过其特有的“--text”选项。你可以使用帮助选项(“--help”)看 # 其中有无一个“--text”项以此来判断所使用的是否是UnxUtils版本。其它DOS # 版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。 sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 或更高版本 tr -d \r <infile >outfile # GNU tr 1.22 或更高版本
# 将每一行前导的“空白字符”(空格,制表符)删除 # 使之左对齐 sed 's/^[ \t]*//' # 见本文末尾关于'\t'用法的描述
# 将每一行拖尾的“空白字符”(空格,制表符)删除 sed 's/[ \t]*$//' # 见本文末尾关于'\t'用法的描述
# 将每一行中的前导和拖尾的空白字符删除 sed 's/^[ \t]*//;s/[ \t]*$//'
# 在每一行开头处插入5个空格(使全文向右移动5个字符的位置) sed 's/^/ /'
# 以79个字符为宽度,将所有文本右对齐 sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # 78个字符外加最后的一个空格
# 以79个字符为宽度,使所有文本居中。在方法1中,为了让文本居中每一行的前 # 头和后头都填充了空格。 在方法2中,在居中文本的过程中只在文本的前面填充 # 空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。 sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # 方法1 sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' # 方法2
# 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar” sed 's/foo/bar/' # 只替换每一行中的第一个“foo”字串 sed 's/foo/bar/4' # 只替换每一行中的第四个“foo”字串 sed 's/foo/bar/g' # 将每一行中的所有“foo”都换成“bar” sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个“foo” sed 's/\(.*\)foo/\1bar/' # 替换最后一个“foo”
# 只在行中出现字串“baz”的情况下将“foo”替换成“bar” sed '/baz/s/foo/bar/g'
# 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换 sed '/baz/!s/foo/bar/g'
# 不管是“scarlet”“ruby”还是“puce”,一律换成“red” sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #对多数的sed都有效 gsed 's/scarlet\|ruby\|puce/red/g' # 只对GNU sed有效
# 倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。 # 由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除 sed '1!G;h;$!d' # 方法1 sed -n '1!G;h;$p' # 方法2
# 将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”) sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
# 将每两行连接成一行(类似“paste”) sed '$!N;s/\n/ /'
# 如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾 # 并去掉原来行尾的反斜杠 sed -e :a -e '/\\$/N; s/\\\n//; ta'
# 如果当前行以等号开头,将当前行并到上一行末尾 # 并以单个空格代替原来行头的“=” sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
# 为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567” gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # 其他sed
# 为带有小数点和负号的数值增加逗号分隔符(GNU sed) gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'
# 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行) gsed '0~5G' # 只对GNU sed有效 sed 'n;n;n;n;G;' # 其他sed
选择性地显示特定行: --------
# 显示文件中的前10行 (模拟“head”的行为) sed 10q
# 显示文件中的第一行 (模拟“head -1”命令) sed q
# 显示文件中的最后10行 (模拟“tail”) sed -e :a -e '$q;N;11,$D;ba'
# 显示文件中的最后2行(模拟“tail -2”命令) sed '$!N;$!D'
# 显示文件中的最后一行(模拟“tail -1”) sed '$!d' # 方法1 sed -n '$p' # 方法2
# 显示文件中的倒数第二行 sed -e '$!{h;d;}' -e x # 当文件中只有一行时,输入空行 sed -e '1{$q;}' -e '$!{h;d;}' -e x # 当文件中只有一行时,显示该行 sed -e '1{$d;}' -e '$!{h;d;}' -e x # 当文件中只有一行时,不输出
# 只显示匹配正则表达式的行(模拟“grep”) sed -n '/regexp/p' # 方法1 sed '/regexp/!d' # 方法2
# 只显示“不”匹配正则表达式的行(模拟“grep -v”) sed -n '/regexp/!p' # 方法1,与前面的命令相对应 sed '/regexp/d' # 方法2,类似的语法
# 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行 sed -n '/regexp/{g;1!p;};h'
# 查找“regexp”并将匹配行的下一行显示出来,但并不显示匹配行 sed -n '/regexp/{n;p;}'
# 显示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所 # 在行的行号 (类似“grep -A1 -B1”) sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
# 显示包含“AAA”、“BBB”或“CCC”的行(任意次序) sed '/AAA/!d; /BBB/!d; /CCC/!d' # 字串的次序不影响结果
# 显示包含“AAA”、“BBB”和“CCC”的行(固定次序) sed '/AAA.*BBB.*CCC/!d'
# 显示包含“AAA”“BBB”或“CCC”的行 (模拟“egrep”) sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # 多数sed gsed '/AAA\|BBB\|CCC/!d' # 对GNU sed有效
# 显示包含“AAA”的段落 (段落间以空行分隔) # HHsed v1.5 必须在“x;”后加入“G;”,接下来的3个脚本都是这样 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
# 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序) sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
# 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序) sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d' # 只对GNU sed有效
# 显示包含65个或以上字符的行 sed -n '/^.\{65\}/p'
# 显示包含65个以下字符的行 sed -n '/^.\{65\}/!p' # 方法1,与上面的脚本相对应 sed '/^.\{65\}/d' # 方法2,更简便一点的方法
# 显示部分文本——从包含正则表达式的行开始到最后一行结束 sed -n '/regexp/,$p'
# 显示部分文本——指定行号范围(从第8至第12行,含8和12行) sed -n '8,12p' # 方法1 sed '8,12!d' # 方法2
# 显示第52行 sed -n '52p' # 方法1 sed '52!d' # 方法2 sed '52q;d' # 方法3, 处理大文件时更有效率
# 从第3行开始,每7行显示一次 gsed -n '3~7p' # 只对GNU sed有效 sed -n '3,${p;n;n;n;n;n;n;}' # 其他sed
# 显示两个正则表达式之间的文本(包含) sed -n '/Iowa/,/Montana/p' # 区分大小写方式
选择性地删除特定行: --------
# 显示通篇文档,除了两个正则表达式之间的内容 sed '/Iowa/,/Montana/d'
# 删除文件中相邻的重复行(模拟“uniq”) # 只保留重复行中的第一行,其他行删除 sed '$!N; /^\(.*\)\n\1$/!P; D'
# 删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存 # 大小,或者使用GNU sed。 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
# 删除除重复行外的所有行(模拟“uniq -d”) sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'
# 删除文件中开头的10行 sed '1,10d'
# 删除文件中的最后一行 sed '$d'
# 删除文件中的最后两行 sed 'N;$!P;$!D;$d'
# 删除文件中的最后10行 sed -e :a -e '$d;N;2,10ba' -e 'P;D' # 方法1 sed -n -e :a -e '1,10!{P;N;D;};N;ba' # 方法2
# 删除8的倍数行 gsed '0~8d' # 只对GNU sed有效 sed 'n;n;n;n;n;n;n;d;' # 其他sed
# 删除匹配式样的行 sed '/pattern/d' # 删除含pattern的行。当然pattern # 可以换成任何有效的正则表达式
# 删除文件中的所有空行(与“grep '.' ”效果相同) sed '/^$/d' # 方法1 sed '/./!d' # 方法2
# 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。 # (模拟“cat -s”) sed '/./,/^$/!d' #方法1,删除文件顶部的空行,允许尾部保留一空行 sed '/^$/N;/\n$/D' #方法2,允许顶部保留一空行,尾部不留空行
# 只保留多个相邻空行的前两行。 sed '/^$/N;/\n$/N;//D'
# 删除文件顶部的所有空行 sed '/./,$!d'
# 删除文件尾部的所有空行 sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # 对所有sed有效 sed -e :a -e '/^\n*$/N;/\n$/ba' # 同上,但只对 gsed 3.02.*有效
# 删除每个段落的最后一行 sed -n '/^$/{p;h;};/./{x;/./p;}'
特殊应用: --------
# 移除手册页(man page)中的nroff标记。在Unix System V或bash shell下使 # 用'echo'命令时可能需要加上 -e 选项。 sed "s/.`echo \\\b`//g" # 外层的双括号是必须的(Unix环境) sed 's/.^H//g' # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H sed 's/.\x08//g' # sed 1.5,GNU sed,ssed所使用的十六进制的表示方法
# 提取新闻组或 e-mail 的邮件头 sed '/^$/q' # 删除第一行空行后的所有内容
# 提取新闻组或 e-mail 的正文部分 sed '1,/^$/d' # 删除第一行空行之前的所有内容
# 从邮件头提取“Subject”(标题栏字段),并移除开头的“Subject:”字样 sed '/^Subject: */!d; s///;q'
# 从邮件头获得回复地址 sed '/^Reply-To:/q; /^From:/h; /./d;g;q'
# 获取邮件地址。在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮 # 地址的部分剃除。(见上一脚本) sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'
# 在每一行开头加上一个尖括号和空格(引用信息) sed 's/^/> /'
# 将每一行开头处的尖括号和空格删除(解除引用) sed 's/^> //'
# 移除大部分的HTML标签(包括跨行标签) sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
# 将分成多卷的uuencode文件解码。移除文件头信息,只保留uuencode编码部分。 # 文件必须以特定顺序传给sed。下面第一种版本的脚本可以直接在命令行下输入; # 第二种版本则可以放入一个带执行权限的shell脚本中。(由Rahul Dhesi的一 # 个脚本修改而来。) sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers. 1 sed '/^end/,/^begin/d' "$@" | uudecode # vers. 2
# 将文件中的段落以字母顺序排序。段落间以(一行或多行)空行分隔。GNU sed使用 # 字元“\v”来表示垂直制表符,这里用它来作为换行符的占位符——当然你也可以 # 用其他未在文件中使用的字符来代替它。 sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g' gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/'
# 分别压缩每个.TXT文件,压缩后删除原来的文件并将压缩后的.ZIP文件 # 命名为与原来相同的名字(只是扩展名不同)。(DOS环境:“dir /b” # 显示不带路径的文件名)。 echo @echo off >zipup.bat dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat
使用SED:Sed接受一个或多个编辑命令,并且每读入一行后就依次应用这些命令。 当读入第一行输入后,sed对其应用所有的命令,然后将结果输出。接着再读入第二 行输入,对其应用所有的命令……并重复这个过程。上一个例子中sed由标准输入设 备(即命令解释器,通常是以管道输入的形式)获得输入。在命令行给出一个或多 个文件名作为参数时,这些文件取代标准输入设备成为sed的输入。sed的输出将被 送到标准输出(显示器)。因此:
cat filename | sed '10q' # 使用管道输入 sed '10q' filename # 同样效果,但不使用管道输入 sed '10q' filename > newfile # 将输出转移(重定向)到磁盘上
要了解sed命令的使用说明,包括如何通过脚本文件(而非从命令行)来使用这些命 令,请参阅《sed & awk》第二版,作者Dale Dougherty和Arnold Robbins (O'Reilly,1997;http://www.ora.com),《UNIX Text Processing》,作者 Dale Dougherty和Tim O'Reilly(Hayden Books,1987)或者是Mike Arst写的教 程——压缩包的名称是“U-SEDIT2.ZIP”(在许多站点上都找得到)。要发掘sed 的潜力,则必须对“正则表达式”有足够的理解。正则表达式的资料可以看 《Mastering Regular Expressions》作者Jeffrey Friedl(O'reilly 1997)。 Unix系统所提供的手册页(“man”)也会有所帮助(试一下这些命令 “man sed”、“man regexp”,或者看“man ed”中关于正则表达式的部分),但 手册提供的信息比较“抽象”——这也是它一直为人所诟病的。不过,它本来就不 是用来教初学者如何使用sed或正则表达式的教材,而只是为那些熟悉这些工具的人 提供的一些文本参考。
括号语法:前面的例子对sed命令基本上都使用单引号('...')而非双引号 ("...")这是因为sed通常是在Unix平台上使用。单引号下,Unix的shell(命令 解释器)不会对美元符($)和后引号(`...`)进行解释和执行。而在双引号下 美元符会被展开为变量或参数的值,后引号中的命令被执行并以输出的结果代替 后引号中的内容。而在“csh”及其衍生的shell中使用感叹号(!)时需要在其前 面加上转义用的反斜杠(就像这样:\!)以保证上面所使用的例子能正常运行 (包括使用单引号的情况下)。DOS版本的Sed则一律使用双引号("...")而不是 引号来圈起命令。
'\t'的用法:为了使本文保持行文简洁,我们在脚本中使用'\t'来表示一个制表 符。但是现在大部分版本的sed还不能识别'\t'的简写方式,因此当在命令行中为 脚本输入制表符时,你应该直接按TAB键来输入制表符而不是输入'\t'。下列的工 具软件都支持'\t'做为一个正则表达式的字元来表示制表符:awk、perl、HHsed、 sedmod以及GNU sed v3.02.80。
不同版本的SED:不同的版本间的sed会有些不同之处,可以想象它们之间在语法上 会有差异。具体而言,它们中大部分不支持在编辑命令中间使用标签(:name)或分 支命令(b,t),除非是放在那些的末尾。这篇文档中我们尽量选用了可移植性较高 的语法,以使大多数版本的sed的用户都能使用这些脚本。不过GNU版本的sed允许使 用更简洁的语法。想像一下当读者看到一个很长的命令时的心情:
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
好消息是GNU sed能让命令更紧凑:
sed '/AAA/b;/BBB/b;/CCC/b;d' # 甚至可以写成 sed '/AAA\|BBB\|CCC/b;d'
此外,请注意虽然许多版本的sed接受象“/one/ s/RE1/RE2/”这种在's'前带有空 格的命令,但这些版本中有些却不接受这样的命令:“/one/! s/RE1/RE2/”。这时 只需要把中间的空格去掉就行了。
速度优化:当由于某种原因(比如输入文件较大、处理器或硬盘较慢等)需要提高 命令执行速度时,可以考虑在替换命令(“s/.../.../”)前面加上地址表达式来 提高速度。举例来说:
sed 's/foo/bar/g' filename # 标准替换命令 sed '/foo/ s/foo/bar/g' filename # 速度更快 sed '/foo/ s//bar/g' filename # 简写形式
当只需要显示文件的前面的部分或需要删除后面的内容时,可以在脚本中使用“q” 命令(退出命令)。在处理大的文件时,这会节省大量时间。因此:
sed -n '45,50p' filename # 显示第45到50行 sed -n '51q;45,50p' filename # 一样,但快得多
如果你有其他的单行脚本想与大家分享或者你发现了本文档中错误的地方,请发电 子邮件给本文档的作者(Eric Pement)。邮件中请记得提供你所使用的sed版本、 该sed所运行的操作系统及对问题的适当描述。本文所指的单行脚本指命令行的长 度在65个字符或65个以下的sed脚本〔译注1〕。本文档的各种脚本是由以下所列作 者所写或提供:
Al Aab # 建立了“seders”邮件列表 Edgar Allen # 许多方面 Yiorgos Adamopoulos # 许多方面 Dale Dougherty # 《sed & awk》作者 Carlos Duarte # 《do it with sed》作者 Eric Pement # 本文档的作者 Ken Pizzini # GNU sed v3.02 的作者 S.G. Ravenhall # 去html标签脚本 Greg Ubben # 有诸多贡献并提供了许多帮助 -------------------------------------------------------------------------
译注1:大部分情况下,sed脚本无论多长都能写成单行的形式(通过`-e'选项和`;' 号)——只要命令解释器支持,所以这里说的单行脚本除了能写成一行还对长度有 所限制。因为这些单行脚本的意义不在于它们是以单行的形式出现。而是让用户能 方便地在命令行中使用这些紧凑的脚本才是其意义所在。
table of Contents 1. Sed简介 2. 定址 3. Sed命令 4. 选项 5. 元字符集 6. 实例 7. 脚本
- 1. Sed简介
- sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。
- 2. 定址
- 可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
- 3. Sed命令
- 调用sed命令有两种形式:
- sed [options] 'command' file(s)
- sed [options] -f scriptfile file(s)
-
- <
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表示把一个字符翻译为另外的字符(但是不用于正则表达式)
-
- 4. 选项
< -e command, --expression=command 允许多台编辑。
- -h, --help
打印帮助,并显示bug列表的地址。
- -n, --quiet, --silent
取消默认输出。
- -f, --filer=script-file
引导sed脚本文件名。
- -V, --version
打印版本和版权信息。
- 5. 元字符集
< ^ 锚定行的开始 如:/^sed/匹配所有以sed开头的行。
- $
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
- .
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
- *
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
- []
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
- [^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
- \(..\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
- &
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
- \<
锚定单词的开始,如:/\
- \>
锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。
- x\{m\}
重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。
- x\{m,\}
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
- x\{m,n\}
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。
- 6. 实例
删除:d命令 $ sed '2d' example-----删除example文件的第二行。
- $ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
- $ sed '$d' example-----删除example文件的最后一行。
- $ sed '/test/'d example-----删除example文件所有包含test的行。
- 替换:s命令
$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
- $ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
- $ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
- $ sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
- $ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
- 选定行的范围:逗号
$ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。
- $ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
- $ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
- 多点编辑:e命令
$ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
- $ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
- 从文件读入:r命令
$ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
- 写入文件:w命令
$ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。
追加命令:a命令 $ sed '/^test/a\\--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
- 插入:i命令
$ sed '/test/i\\
- new line
- -------------------------' example
- 如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
- 下一个:n命令
$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
- 变形:y命令
$ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
- 退出:q命令
$ sed '10q' example-----打印完第10行后,退出sed。
- 保持和获取:h命令和G命令
$ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
- 保持和互换:h命令和x命令
$ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。
- 7. 脚本
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
- 比如,如果要打印出含有字串”1024”的行,我就可能会用:
cat filename | sed –n ‘/1024/p’sed命令详解!
- CREATE OR REPLACE TRIGGER biu_emp_deptno
BEFORE INSERT OR UPDATE OF deptno ON emp FOR EACH ROW WHEN (New.deptno <> 40) BEGIN :New.comm := 0; END; /
- INSERT INTO emp ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES ( 8000, 'Jack', 'ANALYST', NULL, '31-12月-2003', 5000, 600, 20); INSERT INTO emp ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES ( 8001, 'Fred', 'MANAGER', NULL, '31-12月-2002', 6000, 500, 40); COMMIT;
- SELECT ename, sal, comm, deptno
FROM emp WHERE empno>=8000;
- CREATE TABLE TEST_TRG (ID NUMBER, NAME VARCHAR2(20));
- CREATE SEQUENCE SEQ_TEST;
- CREATE OR REPLACE TRIGGER BI_TEST_TRG
BEFORE INSERT OR UPDATE OF ID ON TEST_TRG FOR EACH ROW BEGIN IF INSERTING THEN SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL; ELSE RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!'); END IF; END; /
- INSERT INTO TEST_TRG VALUES (0, 'First row');
INSERT INTO TEST_TRG VALUES (0, 'Second row'); INSERT INTO TEST_TRG VALUES (0, 'Third row'); COMMIT;
- SELECT * FROM TEST_TRG;
- CREATE OR REPLACE TRIGGER aiud_ordmast
AFTER INSERT OR UPDATE OR DELETE ON order_master BEGIN IF UPDATING THEN DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已更新'); ELSIF DELETING THEN DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已删除'); ELSIF INSERTING THEN DBMS_OUTPUT.PUT_LINE('数据已插入 ORDER_MASTER'); END IF; END; /
- CREATE VIEW ord_view AS
SELECT order_master.orderno, order_master.ostatus, order_detail.qty_deld, order_detail.qty_ord FROM order_master, order_detail WHERE order_master.orderno = order_detail.orderno;
- CREATE OR REPLACE TRIGGER order_mast_insert
INSTEAD OF INSERT ON ord_view REFERENCING NEW AS n FOR EACH ROW DECLARE CURSOR ecur IS SELECT * FROM order_master WHERE order_master.orderno = :n.orderno; CURSOR dcur IS SELECT * FROM order_detail WHERE order_detail.orderno = :n.orderno; a ecur%rowtype; b dcur%rowtype; BEGIN OPEN ecur; OPEN dcur; FETCH ecur into a; FETCH dcur into b; IF dcur%notfound THEN INSERT INTO order_master(orderno,ostatus) VALUES(:n.orderno, :n.ostatus); ELSE UPDATE order_master SET order_master.ostatus = :n.ostatus WHERE order_master.orderno = :n.orderno; END IF; IF ecur%notfound THEN INSERT INTO order_detail(qty_ord,qty_deld,orderno) VALUES(:n.qty_ord, :n.qty_deld, :n.orderno); ELSE UPDATE order_detail SET order_detail.qty_ord = :n.qty_ord, order_detail.qty_deld = :n.qty_deld WHERE order_detail.orderno = :n.orderno; END IF; CLOSE ecur; CLOSE dcur; END; /
- CREATE TABLE dropped_obj
( obj_name VARCHAR2(30), obj_type VARCHAR2(20), drop_date DATE );
- CREATE OR REPLACE TRIGGER log_drop_obj
AFTER DROP ON SCHEMA BEGIN INSERT INTO dropped_obj VALUES (ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE, SYSDATE); END; /
- CREATE TABLE for_drop ( x CHAR );
DROP TABLE for_drop;
- SELECT * FROM dropped_obj;
- ALTER TRIGGER biu_emp_deptno DISABLE;
- ALTER TRIGGER biu_emp_deptno ENABLE;
- DROP TRIGGER biu_emp_deptno;
- DESC USER_TRIGGERS;
- SELECT TRIGGER_NAME FROM USER_TRIGGERS
WHERE TABLE_NAME='EMP';
- SELECT TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE
FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'BIU_EMP_DEPTNO';
- SET SERVEROUT ON
BEGIN DBMS_OUTPUT.PUT_LINE('打印三角形'); FOR i IN 1..9 LOOP FOR j IN 1..i LOOP DBMS_OUTPUT.PUT('*'); END LOOP for_j; DBMS_OUTPUT.NEW_LINE; END LOOP for_i; END; /
- SET SERVEROUTPUT ON FORMAT WRAPPED
DECLARE result CLOB; xmlstr VARCHAR2(32767); line VARCHAR2(2000); line_no INTEGER := 1; BEGIN result := DBMS_XMLQuery.getXml('SELECT empno, ename FROM employee'); xmlstr := DBMS_LOB.SUBSTR(result,32767); LOOP EXIT WHEN xmlstr IS NULL; line := SUBSTR(xmlstr,1,INSTR(xmlstr,CHR(10))-1); DBMS_OUTPUT.PUT_LINE(line_no || ':' || line); xmlstr := SUBSTR(xmlstr,INSTR(xmlstr,CHR(10))+1); line_no := line_no + 1; END LOOP; END; /
- DECLARE
l_num NUMBER; counter NUMBER; BEGIN counter:=1; WHILE counter <= 10 LOOP l_num := ABS((DBMS_RANDOM.RANDOM MOD 100)) + 1; DBMS_OUTPUT.PUT_LINE(l_num); counter := counter + 1; END LOOP; END; /
- -- 以 SYSTEM 用户登录执行命令
CREATE DIRECTORY TEST_DIR AS 'C:\DEVELOP'; GRANT READ, WRITE ON DIRECTORY TEST_DIR TO SCOTT;
- -- 以 SCOTT 用户登录
DECLARE src CLOB; xmlfile UTL_FILE.FILE_TYPE; length INTEGER; buffer VARCHAR2(16384); BEGIN src := DBMS_XMLQuery.getXml('select * from emp'); length := DBMS_LOB.GETLENGTH(src); DBMS_LOB.READ(src, length, 1, buffer); xmlfile := UTL_FILE.FOPEN('TEST_DIR', 'employees.xml', 'w'); UTL_FILE.PUT(xmlfile, buffer); UTL_FILE.FCLOSE(xmlfile); END; /
- SET SERVEROUT ON FORMAT WRAPPED
DECLARE input_file UTL_FILE.FILE_TYPE; input_buffer VARCHAR2(4000); BEGIN input_file := UTL_FILE.FOPEN('TEST_DIR', 'employees.xml', 'r'); FOR I IN 1..11 LOOP UTL_FILE.GET_LINE(input_file, input_buffer); DBMS_OUTPUT.PUT_LINE(input_buffer); END LOOP; UTL_FILE.FCLOSE(input_file); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('------------------'); END; /
------数据库的导出和备份exp
------------建表的几个事例
- CREATE TABLE employee
( empno NUMBER(10) PRIMARY KEY, ename VARCHAR2(25), designation VARCHAR2(20), dateofjoining DATE, branchcode VARCHAR2(15) REFERENCES Branch_Details (branchcode), deptcode VARCHAR2(15) REFERENCES Dept_Details (deptcode) );
- alter session set nls_date_language = 'AMERICAN';
- INSERT INTO employee VALUES ('E001', 'John Smith' , 'Manager', '1-FEB-2001', 'BH01', 'DP02');
INSERT INTO employee VALUES ('E002', 'Jane', 'Sales Manager','1-JUNE-2001', 'BH02', 'DP02'); INSERT INTO employee VALUES ('E003', 'Harry ', 'Accountant', '1-NOV-2001', 'BH03', 'DP01'); INSERT INTO employee VALUES ('E004', 'JOE', 'Accountant', '1-DEC-2001', 'BH03', 'DP03'); INSERT INTO employee VALUES ('E005', 'Michael', 'Manager', '1-JAN-2001', 'BH03', 'DP02'); INSERT INTO employee VALUES ('E006', 'Jack Aranck', 'Sales Manager', '1-NOV-2001', 'BH05', 'DP01'); INSERT INTO employee VALUES ('E007', 'George', 'Sr. Accountant', '1-NOV-2001', 'BH05', 'DP03'); INSERT INTO employee VALUES ('E008', 'John Aranck' , 'Sr. Accountant', '1-FEB-2001', 'BH01', 'DP02');
- /
CREATE TABLE Salary_Records (empno VARCHAR2(10) REFERENCES Employee(empno), working_Days NUMBER, empsal NUMBER);
- INSERT INTO Salary_Records VALUES ('E001', 'BH01', 'DP02' , 'John Smith' , 30, 12000);
INSERT INTO Salary_Records VALUES ('E002', 'BH02', 'DP02' , 'Jane' , 25, 15000); INSERT INTO Salary_Records VALUES ('E003', 'BH03', 'DP01' , 'Harry' , 30, 12000); INSERT INTO Salary_Records VALUES ('E004', 'BH03', 'DP03' , 'Joe' , 30, 20000); INSERT INTO Salary_Records VALUES ('E005', 'BH03', 'DP02' , 'Michael' , 30, 18000); INSERT INTO Salary_Records VALUES ('E006', 'BH05', 'DP01' , 'Jack Aranck' , 30, 18000); INSERT INTO Salary_Records VALUES ('E007', 'BH05', 'DP03' , 'George' , 30, 18000);
- /
CREATE TABLE Dept_Details (deptcode VARCHAR2(15) Constraint pkdeptcode PRIMARY KEY, deptname CHAR(15)) ;
- INSERT INTO Dept_Details VALUES ('DP01','Marketing');
INSERT INTO Dept_Details VALUES ('DP02','Sales'); INSERT INTO Dept_Details VALUES ('DP03','Accountants');
- CREATE TABLE Branch_Details
(branchcode VARCHAR2(15) Constraint pkbranchcode PRIMARY KEY, address1 VARCHAR2(20), address2 VARCHAR2(20), city CHAR(10), phone_no CHAR(15));
- INSERT into Branch_Details values('BH01', '01 northway', 'cyber Street', 'New york', '802-384-9491');
INSERT into Branch_Details values('BH02', '56 K Street', 'Pall Mansion', 'California', '354-768-9895'); INSERT into Branch_Details values('BH03', '78 BlueStreet', 'Camay Mall', ' Las Wegas', '323-434-4565'); INSERT into Branch_Details values('BH04', 'Kay Street', ' 700 E LAKE DRIVE', ' New York', '454-655-5286');
- commit;
/
- CREATE TABLE ProductDetails
(Prod_No NUMBER, ProdId VARCHAR2(10), ProdName VARCHAR2(15), ProdPrice NUMBER);
- INSERT INTO ProductDetails VALUES (001,'P001', 'MCSE', 600);
INSERT INTO ProductDetails VALUES (002,'P002', 'SQL SERVER 2000', 800); INSERT INTO ProductDetails VALUES (003,'P003', 'JAVA', 500); INSERT INTO ProductDetails VALUES (004,'P004', 'C++', 300); INSERT INTO ProductDetails VALUES (005,'P005', 'LINUX', 400); INSERT INTO ProductDetails VALUES (006,'P006', 'MCSD', 500); INSERT INTO ProductDetails VALUES (007,'P007', 'ORACLE', 400);
- alter session set nls_date_language = 'SIMPLIFIED CHINESE';
- /
CREATE TABLE ORDER_DETAILS ( ORDERNO VARCHAR2(5) PRIMARY KEY, ODATE DATE, VENCODE VARCHAR2(5), itemcode VARCHAR2(10), qty_ordered NUMBER, OSTATUS CHAR(1), DEL_DATE DATE, ORDER_COST NUMBER );
- /
CREATE TABLE ORDER_COST ( ORDERNO VARCHAR2(10) REFERENCES order_details(orderno), ordercost NUMBER);
- /
CREATE TABLE EMPLOYEES ( EMP_ID NUMBER(4) NOT NULL, LAST_NAME VARCHAR2(30) NOT NULL, FIRST_NAME VARCHAR2(30), DEPT_ID NUMBER(2), JOB_CAT VARCHAR(30), SALARY NUMBER(8,2) );
/
- CREATE TABLE BOOK_DETAILS
( BOOKID VARCHAR2(5) NOT NULL, BOOK_NM VARCHAR2(20) NOT NULL, DOP DATE, PRICE NUMBER, AUTHOR VARCHAR2(30) );
--toys.sql
- CREATE TABLE toys
( toyid VARCHAR2(10), toyname VARCHAR2(15), toyprice NUMBER );
INSERT INTO toys VALUES('P001', 'Doll', 100);
- INSERT INTO toys VALUES('P002','Batman',125);
- INSERT INTO toys VALUES('P003','Spiderman',110);
- INSERT INTO toys VALUES('P004','He-man',200);
- COMMIT;
- CREATE OR REPLACE PROCEDURE
find_emp(emp_no NUMBER) AS empname VARCHAR2(20); BEGIN SELECT ename INTO empname FROM EMP WHERE empno = emp_no; DBMS_OUTPUT.PUT_LINE('雇员姓名是 '|| empname); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('雇员编号未找到'); END find_emp; /
- SET SERVEROUT ON
EXECUTE find_emp(7900);
- CREATE OR REPLACE PROCEDURE
itemdesc(item_code IN VARCHAR2) IS v_itemdesc VARCHAR2(5); BEGIN SELECT itemdesc INTO v_itemdesc FROM itemfile WHERE itemcode = item_code; DBMS_OUTPUT.PUT_LINE(item_code||'项目的说明为'||v_itemdesc); END; /
- EXECUTE itemdesc ('i201');
- CREATE OR REPLACE PROCEDURE
test(value1 IN VARCHAR2,value2 OUT NUMBER) IS identity NUMBER; BEGIN SELECT ITEMRATE INTO identity FROM itemFile WHERE itemcode = value1; IF identity < 200 THEN value2:=100; ELSE value2:=50; END IF; END; /
- DECLARE
value2 NUMBER; BEGIN test ('i202' ,value2); DBMS_OUTPUT.PUT_LINE('value2 的值为'||TO_CHAR(value2)); END; /
- CREATE OR REPLACE PROCEDURE
swap(p1 IN OUT NUMBER, p2 IN OUT NUMBER) IS v_temp NUMBER; BEGIN v_temp := p1; p1 := p2; p2 := v_temp; END; /
- DECLARE
num1 NUMBER := 100; num2 NUMBER := 200; BEGIN swap(num1, num2); DBMS_OUTPUT.PUT_LINE('num1 = ' || num1); DBMS_OUTPUT.PUT_LINE('num2 = ' || num2); END; /
- GRANT EXECUTE ON find_emp TO MARTIN;
- GRANT EXECUTE ON swap TO PUBLIC;
- DROP PROCEDURE test;
- CREATE OR REPLACE FUNCTION
fun_hello RETURN VARCHAR2 IS BEGIN RETURN '朋友,您好!今天是' || TO_CHAR(SYSDATE, 'DAY'); END; /
- SELECT fun_hello FROM DUAL;
- CREATE OR REPLACE FUNCTION
item_price_range (price NUMBER) RETURN VARCHAR2 AS min_price NUMBER; max_price NUMBER; BEGIN SELECT MAX(ITEMRATE), MIN(ITEMRATE) INTO max_price, min_price FROM itemfile; IF price >= min_price AND price <= max_price THEN RETURN '输入的单价介于最低价与最高价之间'; ELSE RETURN '超出范围'; END IF; END; /
- DECLARE
P NUMBER := 300; MSG VARCHAR2(200); BEGIN MSG := item_price_range(P); DBMS_OUTPUT.PUT_LINE(MSG); END; /
- GRANT EXECUTE ON fun_hello TO MARTIN;
- DROP FUNCTION fun_hello;
- CREATE OR REPLACE PROCEDURE p2 AS
a VARCHAR2(50); BEGIN SELECT venadd1 INTO a FROM vendor_master WHERE vencode='V002'; DBMS_OUTPUT.PUT_LINE(a); ROLLBACK; END; /
- CREATE OR REPLACE PROCEDURE p1 AS
b VARCHAR2(50); BEGIN UPDATE vendor_master SET venadd1='10 Walls Street' WHERE vencode='V002'; P2(); SELECT venadd1 INTO b FROM vendor_master WHERE vencode='V002'; DBMS_OUTPUT.PUT_LINE(b); END; /
- EXECUTE p1;
- CREATE OR REPLACE PROCEDURE p2 AS
a VARCHAR2(50); PRAGMA AUTONOMOUS_TRANSACTION; BEGIN SELECT venadd1 INTO a FROM vendor_master WHERE vencode='V002'; DBMS_OUTPUT.PUT_LINE(a); ROLLBACK; END; /
- EXECUTE p1;
- CREATE OR REPLACE PACKAGE pack_me IS
PROCEDURE order_proc (orno VARCHAR2); FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2; END pack_me; /
- CREATE OR REPLACE PACKAGE BODY pack_me AS
PROCEDURE order_proc (orno VARCHAR2) IS stat CHAR(1); BEGIN SELECT ostatus INTO stat FROM order_master WHERE orderno = orno; IF stat = 'p' THEN DBMS_OUTPUT.PUT_LINE('暂挂的订单'); ELSE DBMS_OUTPUT.PUT_LINE('已完成的订单'); END IF; END order_proc; FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2 IS icode VARCHAR2(5); ocode VARCHAR2(5); qtyord NUMBER; qtydeld NUMBER; BEGIN SELECT qty_ord, qty_deld, itemcode, orderno INTO qtyord, qtydeld, icode, ocode FROM order_detail WHERE orderno = ornos; IF qtyord < qtydeld THEN RETURN ocode; ELSE RETURN icode; END IF; END order_fun; END pack_me; /
- EXECUTE pack_me.order_proc('o002');
- DECLARE
msg VARCHAR2(10); BEGIN msg := pack_me.order_fun('o002'); DBMS_OUTPUT.PUT_LINE('值是 ' || msg); END; /
- CREATE OR REPLACE PACKAGE cur_pack IS
CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE; PROCEDURE ord_pro(vcode VARCHAR2); END cur_pack; /
- CREATE OR REPLACE PACKAGE BODY cur_pack AS
CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE IS SELECT * FROM order_master WHERE VENCODE=vcode; PROCEDURE ord_pro(vcode VARCHAR2) IS or_rec order_master%ROWTYPE; BEGIN OPEN ord_cur(vcode); LOOP FETCH ord_cur INTO or_rec; EXIT WHEN ord_cur%NOTFOUND; DBMS_OUTPUT.PUT_LIne('返回的值为' || or_rec.orderno); END LOOP; END ord_pro; END cur_pack; /
- EXEC cur_pack.ord_pro('V001');
- COLUMN OBJECT_NAME FORMAT A18
- SELECT object_name, object_type
FROM USER_OBJECTS WHERE object_type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');
- DESC USER_SOURCE
- COLUMN LINE FORMAT 9999
COLUMN TEXT FORMAT A50
- SELECT line, text FROM USER_SOURCE
WHERE NAME='TEST';
- DESC pack_me;
--_tables.sql
- CREATE TABLE ORDER_DETAIL
( ORDERNO VARCHAR2(5) PRIMARY KEY, ODATE DATE, VENCODE VARCHAR2(5), itemcode VARCHAR2(10), qty_ord NUMBER, qty_deld NUMBER, OSTATUS CHAR(1), DEL_DATE DATE, ORDER_COST NUMBER );
- CREATE TABLE salary_records
( EMPNO VARCHAR2(10), BRANCHCODE VARCHAR2(15), DEPTCODE VARCHAR2(15), EMP_NAME CHAR(20), WORKING_DAYS NUMBER, EMPSAL NUMBER );
- INSERT INTO salary_records VALUES('E001', 'BH01','DP02','John Smith',30,12000);
INSERT INTO salary_records VALUES('E002','BH02','DP02','Jane',25, 15000); INSERT INTO salary_records VALUES('E003','BH03','DP02','Harry',30,12000); INSERT INTO salary_records VALUES('E004','BH01','DP02','WILLIAMS',24,13000); COMMIT;
- SET SERVEROUTPUT ON
BEGIN UPDATE toys SET toyprice=270 WHERE toyid='T005'; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE('表已更新'); ELSE DBMS_OUTPUT.PUT_LINE('编号未找到'); END IF; END; /
- BEGIN
UPDATE vendor_master SET venname='Rob Mathew' WHERE vencode='V004'; DBMS_OUTPUT.PUT_LINE('更新了' || SQL%ROWCOUNT || '行'); END; /
- DECLARE
empid VARCHAR2(10); desig VARCHAR2(20); BEGIN empid:= '&职员编号'; SELECT designation INTO desig FROM employee WHERE empno=empid; IF SQL%ROWCOUNT>0 THEN DBMS_OUTPUT.PUT_LINE('职员的头衔是' || desig); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('职员未找到'); END; /
- DECLARE
empid VARCHAR2(10); BEGIN SELECT empno INTO empid FROM employee; EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('该查询提取多行'); END; /
- SET SERVEROUTPUT ON
DECLARE my_toy_price toys.toyprice%TYPE; CURSOR toy_cur IS SELECT toyprice FROM toys WHERE toyprice<250; BEGIN OPEN toy_cur; LOOP FETCH toy_cur INTO my_toy_price; EXIT WHEN toy_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE (toy_cur%ROWCOUNT || '. 玩具单价:' || my_toy_price); END LOOP; CLOSE toy_cur; END; /
- DECLARE
new_price NUMBER; CURSOR cur_toy IS SELECT toyprice FROM toys WHERE toyprice<100 FOR UPDATE OF toyprice; BEGIN OPEN cur_toy; LOOP FETCH cur_toy INTO new_price; EXIT WHEN cur_toy%NOTFOUND; UPDATE toys SET toyprice = 1.1*new_price WHERE CURRENT OF cur_toy; END LOOP; CLOSE cur_toy; COMMIT; END; /
- SET SERVEROUTPUT ON
DECLARE dept_code emp.deptno%TYPE; emp_code emp.empno%TYPE; emp_name emp.ename%TYPE; CURSOR emp_cur(deptparam NUMBER) IS SELECT empno, ename FROM emp WHERE deptno=deptparam; BEGIN dept_code := &部门编号; OPEN emp_cur(dept_code); LOOP FETCH emp_cur INTO emp_code, emp_name; EXIT WHEN emp_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE(emp_code||' '||emp_name); END LOOP; CLOSE emp_cur; END; /
- DECLARE
CURSOR mytoy_cur IS SELECT toyid, toyname, toyprice FROM toys; BEGIN FOR toy_rec IN mytoy_cur LOOP DBMS_OUTPUT.PUT_LINE ('玩具编号:'||toy_rec.toyid||' ' ||'玩具名称:' ||toy_rec.toyname||' ' ||'玩具单价:' ||toy_rec.toyprice); END LOOP; END; /
- SET SERVEROUTPUT ON
-- 先执行 ACCEPT tab PROMPT '你想查看什么信息?员工信息(E)或部门信息(D):'
- -- 再执行
DECLARE TYPE refcur_t IS REF CURSOR; refcur refcur_t; p_id NUMBER; p_name VARCHAR2(100); selection VARCHAR2(1) := UPPER(SUBSTR('&tab ',1,1)); BEGIN IF selection = 'E' THEN OPEN refcur FOR SELECT empno id, ename name FROM emp; DBMS_OUTPUT.PUT_LINE('===员工信息==='); ELSIF selection = 'D' THEN OPEN refcur FOR SELECT deptno id, dname name FROM dept; DBMS_OUTPUT.PUT_LINE('===部门信息==='); ELSE DBMS_OUTPUT.PUT_LINE('请输入员工信息(E) 或 部门信息(D)'); RETURN; END IF; FETCH refcur INTO p_id, p_name; WHILE refcur%FOUND LOOP DBMS_OUTPUT.PUT_LINE('#' || p_id || ':' || p_name); FETCH refcur INTO p_id, p_name; END LOOP; CLOSE refcur; END; /
- SET SERVEROUTPUT ON
- VARIABLE maxsal NUMBER
- EXECUTE :maxsal := 2500
- DECLARE
r_emp emp%ROWTYPE; TYPE c_type IS REF CURSOR; cur c_type; p_salary NUMBER; BEGIN p_salary := :maxsal; OPEN cur FOR 'select * from emp where sal>:1 order by sal desc' USING p_salary; DBMS_OUTPUT.PUT_LINE('薪水大于'|| p_salary ||'的员工有:'); LOOP FETCH cur INTO r_emp; EXIT WHEN cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE('编号:'|| r_emp.empno || ' 姓名:' || r_emp.ename || ' 薪水:' || r_emp.sal ); END LOOP; CLOSE cur; END; / --employee.sql
- CREATE TABLE Dept_Details
(deptcode VARCHAR2(15) Constraint pkdeptcode PRIMARY KEY, deptname CHAR(15)) ;
- INSERT INTO Dept_Details VALUES ('DP01','Marketing');
INSERT INTO Dept_Details VALUES ('DP02','Sales'); INSERT INTO Dept_Details VALUES ('DP03','Accountants');
- CREATE TABLE Branch_Details
(branchcode VARCHAR2(15) Constraint pkbranchcode PRIMARY KEY, address1 VARCHAR2(20), address2 VARCHAR2(20), city CHAR(10), phone_no CHAR(15));
- INSERT into Branch_Details
values('BH01', '01 northway', 'cyber Street', 'New york', '802-384-9491'); INSERT into Branch_Details values('BH02', '56 K Street', 'Pall Mansion', 'California', '354-768-9895'); INSERT into Branch_Details values('BH03', '78 BlueStreet', 'Camay Mall', ' Las Wegas', '323-434-4565'); INSERT into Branch_Details values('BH04', 'Kay Street', ' 700 E LAKE DRIVE', ' New York', '454-655-5286');
- COMMIT;
- CREATE TABLE employee(
empno VARCHAR2(5), ename VARCHAR2(25), designation VARCHAR2(20), dateofjoining DATE, branchcode VARCHAR2(15) REFERENCES Branch_Details (branchcode), deptcode VARCHAR2(15) REFERENCES Dept_Details (deptcode) );
- INSERT INTO employee VALUES('E001', 'John Smith', 'Sales Manager','14-7月-05', 'BH01','DP02');
- INSERT INTO employee VALUES('E002', 'Jane', 'Sales Manager','14-8月-02', 'BH02','DP02');
- INSERT INTO employee VALUES('E003', 'Harry', 'Accountant','14-7月-05', 'BH03','DP02');
- INSERT INTO employee VALUES('E004', 'Joe', 'Accountant','14-7月-05', 'BH03','DP02');
- COMMIT;
-- 以SCOTT用户登录数据库
- GRANT ALL ON EMP TO ACCP;
- -- 以ACCP用户登录数据库
-- CONNECT ACCP/ACCP; CREATE SYNONYM EMP FOR SCOTT.EMP;
- SELECT * FROM EMP;
- CREATE PUBLIC SYNONYM emp_syn FOR SCOTT.emp;
- SELECT * FROM TAB;
CREATE TABLE TAB (A NUMBER); SELECT * FROM TAB;
- DROP SYNONYM EMP;
- CREATE SEQUENCE toys_seq
START WITH 10 INCREMENT BY 2 MAXVALUE 2000 NOCYCLE CACHE 30;
- INSERT INTO toys (toyid, toyname, toyprice)
VALUES ('P' || toys_seq.NEXTVAL, 'TWENTY', 25); INSERT INTO toys (toyid, toyname, toyprice) VALUES ('P' || toys_seq.NEXTVAL, 'MAGIC PENCIL', 75);
- SELECT toys_seq.CURRVAL FROM dual;
- ALTER SEQUENCE toys_seq
MAXVALUE 5000 CYCLE;
- DROP SEQUENCE toys_seq;
- CREATE VIEW ven_view AS SELECT * FROM vendor_master;
- CREATE VIEW pause_view AS
SELECT * FROM order_master WHERE ostatus = 'p';
- UPDATE pause_view SET ostatus = 'd'
WHERE ostatus = 'p';
- CREATE OR REPLACE VIEW pause_view AS
SELECT * FROM order_master WHERE ostatus = 'p' WITH CHECK OPTION CONSTRAINT chk_pv;
- UPDATE pause_view SET ostatus = 'd'
WHERE ostatus = 'p';
- CREATE OR REPLACE VIEW pause_view AS
SELECT orderno, odate FROM order_master;
- UPDATE pause_view SET ostatus = 'd';
- CREATE OR REPLACE VIEW pause_view AS
SELECT * FROM order_master WITH READ ONLY;
- UPDATE pause_view SET ostatus = 'd';
- CREATE OR REPLACE VIEW ord_ven AS
SELECT * FROM vendor_master ORDER BY venname;
- CREATE FORCE VIEW ven AS SELECT * FROM venmast;
- ALTER VIEW ven COMPILE;
- CREATE OR REPLACE VIEW ven_ord_view AS
SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm, order_master om WHERE vm.vencode = om.vencode;
- CREATE OR REPLACE VIEW ven_ord_outj_view AS
SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm, order_master om WHERE vm.vencode = om.vencode(+);
- SELECT vm.vencode, venname, orderno, odate, ostatus
FROM vendor_master vm LEFT OUTER JOIN order_master om ON vm.vencode = om.vencode;
- UPDATE ven_ord_view SET odate = odate+1
WHERE vencode ='V003';
- UPDATE ven_ord_view SET venname = 'Michael'
WHERE vencode = 'V004';
- SELECT * FROM USER_UPDATABLE_COLUMNS
WHERE TABLE_NAME = 'VEN_ORD_VIEW';
- CREATE VIEW vendor_master_view AS
SELECT vencode, UPPER(venname) vendor_name FROM vendor_master;
- DROP VIEW pause_view;
- CREATE INDEX item_index ON itemfile (itemcode);
- ALTER INDEX item_index REBUILD;
- DROP INDEX item_index;
- CREATE UNIQUE INDEX item_index ON itemfile (itemcode);
- CREATE INDEX comp_index ON itemfile(p_category, itemrate);
- CREATE INDEX rev_index ON itemfile (itemcode) REVERSE;
- ALTER INDEX rev_index REBUILD NOREVERSE;
- CREATE BITMAP INDEX bit_ind1 ON order_detail(itemcode);
- CREATE TABLE ind_org_tab (
vencode NUMBER(4) PRIMARY KEY, venname VARCHAR2(20) ) ORGANIZATION INDEX;
- -- 以 SYSTEM 用户授予 ACCP 用户 QUERY REWRITE 权限
CREATE INDEX vn_ind ON vendor_master(UPPER(venname));
- CREATE INDEX exp_ind ON itemfile (qty_hand*itemrate);
- SELECT * FROM vendor_master
WHERE UPPER(venname)='SMALL';
- CREATE TABLE order_mast
( orderno NUMBER(4), venname VARCHAR2(20) ) PARTITION BY RANGE(orderno) ( PARTITION oe1 VALUES LESS THAN (1000), PARTITION oe2 VALUES LESS THAN (2000), PARTITION oe3 VALUES LESS THAN (MAXVALUE) );
- CREATE INDEX myind ON order_mast(orderno) LOCAL;
- SELECT segment_name, partition_name,
segment_type, tablespace_name FROM USER_SEGMENTS WHERE segment_name = 'MYIND';
- CREATE INDEX glb_ind ON order_mast(orderno) GLOBAL
PARTITION BY RANGE (orderno) ( PARTITION ip1 VALUES LESS THAN (1500), PARTITION ip2 VALUES LESS THAN (MAXVALUE) );
- SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
FROM USER_IND_COLUMNS ORDER BY INDEX_NAME, COLUMN_POSITION;
- -- CREATE DIRECTORY BOOK_TEXT AS 'C:\BOOKS';
CREATE TABLE my_book ( file_descr VARCHAR2(40), book_file BFILE );
- INSERT INTO my_book VALUES ('第一章',
BFILENAME ('BOOK_TEXT', 'chapter01.txt'));
- COMMIT;
- CREATE DIRECTORY IMAGES AS 'C:\IMAGES';
GRANT READ ON DIRECTORY IMAGES TO SCOTT;
- CREATE TABLE my_diagrams
( chapter_descr VARCHAR2(40), diagram_no INTEGER, diagram BLOB );
- DECLARE
l_bfile BFILE; l_blob BLOB; BEGIN INSERT INTO my_diagrams (diagram) VALUES (EMPTY_BLOB()) RETURN diagram INTO l_blob; l_bfile := BFILENAME('IMAGES', '\MYIMAGE.JPG'); DBMS_LOB.OPEN(l_bfile, DBMS_LOB.FILE_READONLY); DBMS_LOB.LOADFROMFILE(l_blob, l_bfile, DBMS_LOB.GETLENGTH(l_bfile)); DBMS_LOB.CLOSE(l_bfile); COMMIT; END; /
- CREATE TABLE my_book_text
( chapter_id NUMBER(3), chapter_descr VARCHAR2(40), chapter_text CLOB );
- INSERT INTO my_book_text
VALUES(5, '第五章 PL/SQL简介', 'PL/SQL可用于创建存储过程、触发器和程序包等,用来处理业务规则、数据库事件或给SQL命令的执行添加程序逻辑。'); COMMIT;
- SET SERVEROUTPUT ON
DECLARE clob_var CLOB; amount INTEGER; offset INTEGER; output_var VARCHAR2(100); BEGIN SELECT chapter_text INTO clob_var FROM my_book_text WHERE chapter_id=5; amount := 24; -- 要读取的字符数 offset := 1; -- 起始位置 DBMS_LOB.READ (clob_var,amount,offset,output_var); DBMS_OUTPUT.PUT_LINE(output_var); END; /
- SET SERVEROUTPUT ON
DECLARE icode VARCHAR2(4); irate NUMBER; BEGIN SELECT itemcode, itemrate INTO icode, irate FROM itemfile WHERE itemcode = 'i203'; IF irate > 200 THEN UPDATE itemfile SET itemrate = itemrate - 200 WHERE itemcode = 'i203'; ELSE UPDATE itemfile SET itemrate = itemrate - 50 WHERE itemcode = 'i203'; END IF; DBMS_OUTPUT.PUT_LINE('itemcode'|| ' ' ||'itemrate'); DBMS_OUTPUT.PUT_LINE(icode || ' ' || irate); END; /
- BEGIN
CASE '&grade' WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('优异'); WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE ('优秀'); WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE ('良好'); WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE ('一般'); WHEN 'E' THEN DBMS_OUTPUT.PUT_LINE ('较差'); ELSE DBMS_OUTPUT.PUT_LINE ('没有此成绩'); END CASE; END; /
- DECLARE
grade VARCHAR2(2); BEGIN grade := '&grade'; CASE WHEN grade='A' THEN DBMS_OUTPUT.PUT_LINE('优异'); WHEN grade='B' THEN DBMS_OUTPUT.PUT_LINE ('优秀'); WHEN grade='C' THEN DBMS_OUTPUT.PUT_LINE ('良好'); WHEN grade='D' THEN DBMS_OUTPUT.PUT_LINE ('一般'); WHEN grade='E' THEN DBMS_OUTPUT.PUT_LINE ('较差'); ELSE DBMS_OUTPUT.PUT_LINE ('没有此成绩'); END CASE; END; /
- BEGIN
LOOP IF &marks > 60 THEN DBMS_OUTPUT.PUT_LINE('该生已通过'); EXIT; END IF; END LOOP; END; /
- DECLARE
MONTHLY_VALUE NUMBER := 0; DAILY_VALUE NUMBER:=0; BEGIN WHILE monthly_value <= 4000 LOOP monthly_value := daily_value * 31; daily_value := daily_value + 10; dbms_output.put_line('每日销量:' || daily_value); END LOOP; dbms_output.put_line('每月销量:' || monthly_value); END; /
- BEGIN
FOR even_number IN 1..25 LOOP DBMS_OUTPUT.PUT_LINE(even_number*2); END LOOP; END; /
- DECLARE
qtyhand itemfile.qty_hand%type; relevel itemfile.re_level%type; BEGIN SELECT qty_hand,re_level INTO qtyhand,relevel FROM itemfile WHERE itemcode = 'i201'; IF qtyhand < relevel THEN GOTO updation; ELSE GOTO quit; END IF; <<updation>> UPDATE itemfile SET qty_hand = qty_hand + re_level WHERE itemcode = 'i201'; <<quit>> NULL; END; /
- DECLARE
sql_stmt VARCHAR2(200); emp_id NUMBER(4) := 7566; emp_rec emp%ROWTYPE; BEGIN EXECUTE IMMEDIATE 'CREATE TABLE bonus1 (id NUMBER, amt NUMBER)';
- sql_stmt := 'SELECT * FROM emp WHERE empno = :id';
EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id; END; /
- SET SERVEROUTPUT ON
DECLARE ordernum VARCHAR2(5); BEGIN SELECT orderno INTO ordernum FROM order_master; EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE ('返回多行'); END; /
- SET SERVEROUTPUT ON
DECLARE invalidCATEGORY EXCEPTION; category varchar2(10); BEGIN category := '&Category'; IF category NOT IN ('附件','顶盖','备件') THEN RAISE invalidCATEGORY; ELSE DBMS_OUTPUT.PUT_LINE('您输入的类别是'|| category); END IF; EXCEPTION WHEN invalidCATEGORY THEN DBMS_OUTPUT.PUT_LINE('无法识别该类别'); END; /
- DECLARE
rate itemfile.itemrate%TYPE; rate_exception EXCEPTION; BEGIN SELECT NVL(itemrate,0) INTO rate FROM itemfile WHERE itemcode = 'i207'; IF rate = 0 THEN RAISE rate_exception; ELSE DBMS_OUTPUT.PUT_LINE('项费率为:' || rate); END IF; EXCEPTION WHEN rate_exception THEN RAISE_APPLICATION_ERROR(-20001, '未指定项费率'); END; /
REM ##### 创建表并插入测试数据 ########
- DROP TABLE vendor_master CASCADE CONSTRAINTS;
CREATE TABLE vendor_master ( vencode VARCHAR2(5), venname VARCHAR2(25), venadd1 VARCHAR2(20), venadd2 VARCHAR2(20), venadd3 VARCHAR2(20), tel_no VARCHAR2(12) );
- INSERT INTO vendor_master
VALUES('V001', 'John Smith', '11 E Main St','West Avenue', 'Alabama', '91724523'); INSERT INTO vendor_master VALUES('V002','Dave Jones','1055 North Pitt', 'Atlanta','GA','87623433'); INSERT INTO vendor_master (vencode, venname, tel_no) VALUES('V003', 'Williams', '23121872'); INSERT INTO vendor_master VALUES('V004', 'Small', null, null, null, '54287912'); COMMIT;
- DROP TABLE order_master CASCADE CONSTRAINTS;
CREATE TABLE order_master ( orderno VARCHAR2(5), odate DATE, vencode VARCHAR2(5), ostatus CHAR(1), del_date DATE );
- -- 临时修改日期语言, 以识别英文格式的月份
alter session set nls_date_language = 'AMERICAN';
- INSERT INTO order_master VALUES('o001','12-MAY-05', 'V002','c', '15-MAY-05');
INSERT INTO order_master VALUES('o002','14-MAY-05', 'V001','p', '15-MAY-05'); INSERT INTO order_master VALUES('o003','14-MAY-05', 'V001','p', '15-FEB-05'); INSERT INTO order_master VALUES('o004','14-MAY-05', 'V003','p', '15-FEB-05'); INSERT INTO order_master VALUES('o005','14-MAY-05', 'V001','p', '15-FEB-05'); INSERT INTO order_master VALUES('o006','14-APR-03', 'V004','p', '18-MAY-05'); INSERT INTO order_master VALUES('o007','14-MAY-04', 'V003','p', '10-FEB-05'); INSERT INTO order_master VALUES('o008','11-MAY-05', 'V001','p', '12-JUN-05'); INSERT INTO order_master VALUES('o009','14-JAN-05', 'V002','c', '16-FEB-05'); INSERT INTO order_master VALUES('o011','14-JAN-05', 'V001','p', '10-FEB-05'); INSERT INTO order_master VALUES('o012','14-FEB-05', 'V003','p', '15-MAY-05'); INSERT INTO order_master VALUES('o013','14-MAR-05', 'V001','p', '15-MAY-05'); INSERT INTO order_master VALUES('o014','14-FEB-05', 'V002','c', '12-MAY-05'); INSERT INTO order_master VALUES('o015','14-APR-03', 'V004','p', '17-APR-05'); COMMIT;
- -- 修改日期语言为简体中文
alter session set nls_date_language = 'SIMPLIFIED CHINESE';
- DROP TABLE itemfile CASCADE CONSTRAINTS;
CREATE TABLE itemfile ( itemcode varchar2(4), itemdesc varchar2(20), p_category varchar2(20), qty_hand number(5), re_level number(5), max_level number(5), itemrate number(7,2) );
- INSERT INTO itemfile VALUES('i201','nuts','spares',100,50,250,20);
INSERT INTO itemfile VALUES('i202','bolts','spares',95,125,300,16.5); INSERT INTO itemfile VALUES('i204','holders','spares',18,30,75,112); INSERT INTO itemfile VALUES('i205','covers','accessories',30,15,50,400); INSERT INTO itemfile VALUES('i203','panels','accessories',75,30,150,4000); INSERT INTO itemfile VALUES('i206','brackets','spares',150,73,200,132);
- COMMIT;
- SELECT * FROM order_master WHERE vencode='V002'
FOR UPDATE; -- OF odate, del_date;
- UPDATE order_master SET del_date='28-8月-05'
WHERE vencode='V002';
- COMMIT;
- SELECT * FROM order_master WHERE vencode='V002'
FOR UPDATE;
- SELECT * FROM order_master WHERE vencode='V002'
FOR UPDATE WAIT 5;
- LOCK TABLE order_master IN SHARE MODE;
- LOCK TABLE itemfile IN EXCLUSIVE MODE NOWAIT;
- CREATE TABLE SALES
( PRODUCT_ID VARCHAR2(5), SALES_DATE DATE NOT NULL, SALES_COST NUMBER(10) ) PARTITION BY RANGE (SALES_COST) ( PARTITION P1 VALUES LESS THAN (1000), PARTITION P2 VALUES LESS THAN (2000), PARTITION P3 VALUES LESS THAN (3000) );
- CREATE TABLE SALES2
( PRODUCT_ID VARCHAR2(5), SALES_DATE DATE NOT NULL, SALES_COST NUMBER(10) ) PARTITION BY RANGE (SALES_DATE) ( PARTITION P1 VALUES LESS THAN (TO_DATE('2003-01-01', 'YYYY-MM-DD')), PARTITION P2 VALUES LESS THAN (TO_DATE('2004-01-01', 'YYYY-MM-DD')), PARTITION P3 VALUES LESS THAN (MAXVALUE) );
- CREATE TABLE EMPLOYEE
( EMP_ID NUMBER(4), EMP_NAME VARCHAR2(14), EMP_ADDRESS VARCHAR2(15), DEPARTMENT VARCHAR2(10) ) PARTITION BY HASH (DEPARTMENT) PARTITIONS 4;
- CREATE TABLE MY_EMP
( EMPNO NUMBER(4), ENAME VARCHAR2(15) ) PARTITION BY HASH (EMPNO) ( PARTITION part_1, PARTITION part_2 );
- CREATE TABLE SALES3
( PRODUCT_ID VARCHAR2 (5), SALES_DATE DATE NOT NULL, SALES_COST NUMBER (10) ) PARTITION BY RANGE (SALES_DATE) SUBPARTITION BY HASH (PRODUCT_ID) SUBPARTITIONS 5 ( PARTITION P1 VALUES LESS THAN (DATE '2001-04-01'), PARTITION P2 VALUES LESS THAN (DATE '2001-07-01'), PARTITION P3 VALUES LESS THAN (DATE '2001-09-01'), PARTITION P4 VALUES LESS THAN (MAXVALUE) );
- CREATE TABLE EMPLOYEE
( EMP_ID NUMBER(4), EMP_NAME VARCHAR2(14), EMP_ADDRESS VARCHAR2(15), DEPARTMENT VARCHAR2(10) ) PARTITION BY LIST (EMP_ADDRESS) ( PARTITION NORTH VALUES ('芝加哥'), PARTITION WEST VALUES ('旧金山', '洛杉矶'), PARTITION SOUTH VALUES ('亚特兰大', '达拉斯', '休斯顿'), PARTITION EAST VALUES ('纽约', '波士顿') );
- INSERT INTO SALES3 VALUES ('P001', '02-3月-2001', 2000);
INSERT INTO SALES3 VALUES ('P002', '10-5月-2001', 2508); INSERT INTO SALES3 VALUES ('P003', '05-7月-2001', 780); INSERT INTO SALES3 VALUES ('P004', '12-9月-2001', 1080); COMMIT;
- SELECT * FROM SALES3 PARTITION (P3);
- INSERT INTO MY_EMP SELECT EMPNO, ENAME FROM SCOTT.EMP;
- SELECT * FROM MY_EMP PARTITION (PART_1);
- DELETE FROM MY_EMP PARTITION (PART_2);
- ALTER TABLE SALES ADD PARTITION P4 VALUES LESS THAN (4000);
- ALTER TABLE SALES DROP PARTITION P4;
- ALTER TABLE SALES TRUNCATE PARTITION P3;
- ALTER TABLE SALES MERGE PARTITIONS P1, P2 INTO PARTITION P2;
- ALTER TABLE SALES2 SPLIT PARTITION P3 AT (DATE '2005-01-01')
INTO (PARTITION P31, PARTITION P32);
- ALTER TABLE SALES2 RENAME PARTITION P31 TO P3;
ALTER TABLE SALES2 RENAME PARTITION P32 TO P4;
-- 以 SYSTEM 用户登录 SQL*Plus
- -- 创建一个自动增长的表空间worktbs
CREATE TABLESPACE worktbs DATAFILE 'D:\ORACLE\ORADATA\APTECH\WORKTBS01.DBF' SIZE 10M AUTOEXTEND ON;
- -- 创建用户
CREATE USER MARTIN IDENTIFIED BY martinpwd DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP;
- -- 授予连接和创建各种数据库对象的权限
GRANT CONNECT TO MARTIN;
- -- 授予使用表空间资源的权限
GRANT RESOURCE TO MARTIN;
- -- 修改用户密码
ALTER USER MARTIN IDENTIFIED BY martinpass;
- -- 删除用户及其拥有的对象
DROP USER MARTIN CASCADE;
- -- Connect as SCOTT
SELECT ROWID, ENAME FROM EMP WHERE EMPNO='7900';
- SELECT * FROM EMP WHERE ROWNUM<11;
- -- 创建表
CREATE TABLE vendor_master ( vencode VARCHAR2(5), venname VARCHAR2(20), venadd1 VARCHAR2(20), venadd2 VARCHAR2(20), venadd3 VARCHAR2(20) );
- ALTER TABLE vendor_master
MODIFY (venname varchar2(25));
- ALTER TABLE vendor_master
ADD ( tel_no varchar2(12), tngst_no number(12) );
- ALTER TABLE vendor_master DROP COLUMN tngst_no;
- -- 显示表结构
DESC vendor_master
- -- 删除表
DROP TABLE vendor_master;
- SELECT * FROM vendor_master;
- SELECT vencode, venname, tel_no FROM vendor_master;
- SELECT DISTINCT vencode FROM order_master;
- SELECT * FROM order_master
WHERE vencode='V004' ORDER BY del_date;
- SELECT itemcode, itemdesc, p_category,
qty_hand, re_level, max_level FROM itemfile;
- SELECT itemcode, itemdesc, p_category,
qty_hand, re_level, max_level FROM itemfile ORDER BY p_category, itemcode DESC;
- CREATE TABLE newitemfile AS SELECT * FROM itemfile;
- CREATE TABLE newitemfile1 AS SELECT itemcode, itemdesc, qty_hand FROM itemfile;
- CREATE TABLE newitemfile2 AS SELECT * FROM itemfile WHERE 1 = 2;
- SELECT itemcode,itemdesc, max_level, max_level*2 AS new_maxlevel FROM itemfile;
- SELECT itemcode,itemdesc, max_level, max_level*2 "New Maximum Level" FROM itemfile;
- INSERT INTO vendor_master
VALUES('V001', 'John Smith', '11 E Main St', 'West Avenue', 'Alabama', '91724523');
- INSERT INTO vendor_master(vencode, venname, tel_no)
VALUES('V003', 'Williams', '23121872');
- INSERT INTO vendor_master
VALUES('V004', 'Small', null, null, null, '54287912');
- CREATE TABLE order_master(
orderno VARCHAR2(5), odate DATE, vencode VARCHAR2(5), ostatus CHAR(1), del_date DATE );
- INSERT INTO order_master
VALUES('o001', '12-5月-05', 'V002', 'c', '25-5月-05');
- INSERT INTO newvendor_master select * from vendor_master;
- INSERT INTO newvendor_master(vencode,venname) select vencode,venname from vendor_master;
- UPDATE vendor_master
SET tel_no = '71645221' WHERE vencode = 'V002';
- UPDATE order_master SET ostatus = 'c' ;
- DELETE FROM order_master WHERE orderno='o006';
- UPDATE order_master
SET del_date = '30-8月-05' WHERE orderno <= 'o002'; SAVEPOINT mark1; DELETE FROM order_master WHERE orderno = 'o002'; SAVEPOINT mark2; ROLLBACK TO SAVEPOINT mark1; COMMIT;
- GRANT SELECT, UPDATE ON order_master
TO MARTIN;
- GRANT UPDATE(qty_hand,re_level) ON itemfile
TO MARTIN;
- GRANT SELECT ON vendor_master
TO accounts WITH GRANT OPTION;
- REVOKE SELECT, UPDATE ON order_master FROM MARTIN ;
- SELECT itemdesc, max_level - qty_hand avble_limit
FROM itemfile WHERE p_category='spares';
- SELECT itemdesc, re_level
FROM itemfile WHERE qty_hand < max_level/2;
- SELECT orderno FROM order_master
WHERE del_date IN('15-5月-05','15-2月-05');
- SELECT vencode,venname,tel_no
FROM vendor_master WHERE venname LIKE '%s';
- SELECT vencode,venname,tel_no
FROM vendor_master WHERE venname LIKE 'S___l';
- SELECT * FROM order_master
WHERE odate > '10-5月-05' AND del_date < '26-5月-05';
- SELECT orderno FROM order_master
UNION SELECT orderno FROM order_detail;
- SELECT orderno FROM order_master
UNION ALL SELECT orderno FROM order_detail;
- SELECT qty_hand,max_level FROM itemfile
UNION SELECT qty_ord,qty_deld FROM order_detail ORDER BY 2;
- SELECT orderno FROM order_master
INTERSECT SELECT orderno FROM order_detail;
- SELECT orderno FROM order_master
MINUS SELECT orderno FROM order_detail;
- SELECT ('供应商'||venname||'的地址是 '||venadd1||' '
|| venadd2 ||' '|| venadd3) address FROM vendor_master WHERE vencode='V001';
- SELECT del_date, ADD_MONTHS(del_date,2) FROM order_master;
- SELECT SYSDATE,LAST_DAY(SYSDATE) FROM dual;
- SELECT del_date, ROUND(del_date,'YEAR')
FROM order_master WHERE vencode='V001';
- SELECT ROUND(DATE'2005-5-10', 'MONTH'),
ROUND(DATE'2005-6-16', 'MONTH') FROM dual;
- SELECT NEXT_DAY(SYSDATE,'星期二') FROM dual;
- SELECT TRUNC(SYSDATE, 'YEAR') FROM dual;
- SELECT TRUNC(SYSDATE,'DAY') FROM dual;
- SELECT TRUNC(SYSDATE) FROM dual;
- SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual;
- -- 字符函数
- select initcap('hello') from dual;
select lower('FUN') from dual; select upper('sun') from dual; select ltrim( 'xyzadams','xyz') from dual; select rtrim('xyzadams','ams') from dual; select translate('jack','abcd' ,'1234') from dual; select replace('jack and jue' ,'j','bl') from dual; select instr ('worldwide','d') from dual; select substr('abcdefg',3,2) from dual; select concat ('Hello',' world') from dual;
- SELECT CHR(67) FROM dual;
- SELECT LPAD('function',15,'=') FROM dual;
- SELECT TRIM (LEADING 9 FROM 99998769789999) FROM dual;
- SELECT TRIM (TRAILING 9 FROM 99998769789999) FROM dual;
- SELECT TRIM (9 FROM 9999876789999) FROM dual;
- SELECT LENGTH('frances') FROM dual;
- SELECT orderno, DECODE(ostatus,'p','准备处理','c','已完成')
FROM order_master;
- -- 数字函数
select abs(-15) from dual; select ceil(44.778) from dual; select sin(1.571) from dual; select cos(0) from dual; select sign(-32) from dual; select floor(100.2) from dual; select power(4,2) from dual; select mod(10,3) from dual; select round(100.256,2) from dual; select trunc(100.256,2) from dual; select sqrt(4) from dual;
- SELECT TO_CHAR(sysdate,'YYYY"年"fmMM"月"fmDD"日" HH24:MI:SS') FROM dual;
- SELECT TO_CHAR(itemrate,'C99999') FROM itemfile;
- SELECT TO_DATE('2005-12-06' , 'yyyy-mm-dd') FROM dual;
- SELECT SQRT(TO_NUMBER('100')) FROM dual;
- SELECT itemdesc, NVL(re_level,0) FROM itemfile;
- SELECT itemdesc,NVL2(re_level,re_level,max_level)
FROM itemfile;
- SELECT itemdesc,NULLIF(re_level,max_level)
FROM itemfile;
- SELECT AVG (re_level) FROM itemfile
WHERE p_category='accessories';
- SELECT MIN(max_level) FROM itemfile
WHERE p_category='spares';
- SELECT SUM(itemrate*max_level) FROM itemfile;
- SELECT * FROM itemfile;
- SELECT COUNT(*) FROM itemfile;
- SELECT COUNT(itemrate) FROM itemfile;
- SELECT COUNT(DISTINCT p_category) FROM itemfile;
- SELECT p_category,MAX(itemrate) FROM itemfile
GROUP BY p_category;
- SELECT p_category,MAX(itemrate) FROM itemfile
GROUP BY p_category HAVING p_category NOT IN ('accessories');
- SELECT ename, job, deptno, sal, ROW_NUMBER() OVER
(ORDER BY sal DESC) AS SAL_RANK FROM SCOTT.EMP;
- SELECT ename, job, deptno, sal, ROW_NUMBER() OVER
(PARTITION BY deptno ORDER BY sal DESC) AS SAL_RANK FROM SCOTT.EMP;
- SELECT ename, sal, comm, deptno,
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC, comm) RANK FROM scott.emp;
- SELECT d.dname, e.ename, e.sal, DENSE_RANK()
OVER (PARTITION BY e.deptno ORDER BY e.sal DESC) DENSERANK FROM emp e, dept d WHERE e.deptno = d.deptno;
|