|
|
March 10 msn新病毒: 每当我开机登陆msn的时候, msn自动发心信息给我的msn上的好友, 真是烦啊~!````` 天天都是这样```类似以前qq尾巴, 前段文字为汉字,后面跟带一个网址; 这个病毒是我上中国缘那个网站 www.meet8.com以后就天天这样子了~```, 开机开msn就自动给msn上的在线用户发信息, 烦死人了~!
在网上找了也没找到能够解决的方法, 火急啊~~````` 求大侠们帮忙啊~~!!!!!!!
自己通过以下三种方法解决都无济于事``````
1) 360安全卫士通杀 2)卡巴7.0注册版通杀 3)自己在系统注册表里搜索相关信息内容删除
这三部都做过了还是不起作用, 发贴敬请各位大哥大侠们帮忙啊~!!!!!! January 30
IETF RFC 1213 / RFC1213 Management Information Base for Network Management of TCP/IP-based internets:MIB-II
Network Working Group K. McCloghrie Request for Comments: 1213 Hughes LAN Systems, Inc. Obsoletes: RFC 1158 M. Rose Performance Systems International Editors March 1991
Management Information Base for Network Management of TCP/IP-based internets: MIB-II
Status of this Memo
This memo defines the second version of the Management Information Base (MIB-II) for use with network management protocols in TCP/IP- based internets. This RFC specifies an IAB standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "IAB Official Protocol Standards" for the standardization state and status of this protocol. Distribution of this memo is unlimited.
Table of Contents
1. Abstract............................................... 2 2. Introduction .......................................... 2 3. Changes from RFC 1156 ................................. 3 3.1 Deprecated Objects ................................... 3 3.2 Display Strings ...................................... 4 3.3 Physical Addresses ................................... 4 3.4 The System Group ..................................... 5 3.5 The Interfaces Group ................................. 5 3.6 The Address Translation Group ........................ 6 3.7 The IP Group ......................................... 6 3.8 The ICMP Group ....................................... 7 3.9 The TCP Group ........................................ 7 3.10 The UDP Group ....................................... 7 3.11 The EGP Group ....................................... 7 3.12 The Transmission Group .............................. 8 3.13 The SNMP Group ...................................... 8 3.14 Changes from RFC 1158 ................. ............. 9 4. Objects ............................................... 10 4.1 Format of Definitions ................................ 10 5. Overview .............................................. 10 6. Definitions ........................................... 12 6.1 Textual Conventions .................................. 12 6.2 Groups in MIB-II ..................................... 13 6.3 The System Group ..................................... 13
SNMP Working Group Page 1
RFC 1213 MIB-II March 1991
6.4 The Interfaces Group ................................. 16 6.5 The Address Translation Group ........................ 23 6.6 The IP Group ......................................... 26 6.7 The ICMP Group ....................................... 41 6.8 The TCP Group ........................................ 46 6.9 The UDP Group ........................................ 52 6.10 The EGP Group ....................................... 54 6.11 The Transmission Group .............................. 60 6.12 The SNMP Group ...................................... 60 7. Acknowledgements ...................................... 67 8. References ............................................ 69 9. Security Considerations ............................... 70 10. Authors' Addresses ................................... 70
1. Abstract
This memo defines the second version of the Management Information Base (MIB-II) for use with network management protocols in TCP/IP- based internets. In particular, together with its companion memos which describe the structure of management information (RFC 1155) along with the network management protocol (RFC 1157) for TCP/IP- based internets, these documents provide a simple, workable architecture and system for managing TCP/IP-based internets and in particular the Internet community.
2. Introduction
As reported in RFC 1052, IAB Recommendations for the Development of Internet Network Management Standards [1], a two-prong strategy for network management of TCP/IP-based internets was undertaken. In the short-term, the Simple Network Management Protocol (SNMP) was to be used to manage nodes in the Internet community. In the long-term, the use of the OSI network management framework was to be examined. Two documents were produced to define the management information: RFC 1065, which defined the Structure of Management Information (SMI) [2], and RFC 1066, which defined the Management Information Base (MIB) [3]. Both of these documents were designed so as to be compatible with both the SNMP and the OSI network management framework.
This strategy was quite successful in the short-term: Internet-based network management technology was fielded, by both the research and commercial communities, within a few months. As a result of this, portions of the Internet community became network manageable in a timely fashion.
As reported in RFC 1109, Report of the Second Ad Hoc Network Management Review Group [4], the requirements of the SNMP and the OSI
SNMP Working Group Page 2
RFC 1213 MIB-II March 1991
network management frameworks were more different than anticipated. As such, the requirement for compatibility between the SMI/MIB and both frameworks was suspended. This action permitted the operational network management framework, the SNMP, to respond to new operational needs in the Internet community by producing this document.
As such, the current network management framework for TCP/IP- based internets consists of: Structure and Identification of Management Information for TCP/IP-based internets, RFC 1155 [12], which describes how managed objects contained in the MIB are defined; Management Information Base for Network Management of TCP/IP-based internets: MIB-II, this memo, which describes the managed objects contained in the MIB (and supercedes RFC 1156 [13]); and, the Simple Network Management Protocol, RFC 1098 [5], which defines the protocol used to manage these objects.
3. Changes from RFC 1156
Features of this MIB include:
(1) incremental additions to reflect new operational requirements;
(2) upwards compatibility with the SMI/MIB and the SNMP;
(3) improved support for multi-protocol entities; and,
(4) textual clean-up of the MIB to improve clarity and readability.
The objects defined in MIB-II have the OBJECT IDENTIFIER prefix:
mib-2 OBJECT IDENTIFIER ::= { mgmt 1 }
which is identical to the prefix used in MIB-I.
3.1. Deprecated Objects
In order to better prepare implementors for future changes in the MIB, a new term "deprecated" may be used when describing an object. A deprecated object in the MIB is one which must be supported, but one which will most likely be removed from the next version of the MIB (e.g., MIB-III).
MIB-II marks one object as being deprecated:
atTable
SNMP Working Group Page 3
RFC 1213 MIB-II March 1991
As a result of deprecating the atTable object, the entire Address Translation group is deprecated.
Note that no functionality is lost with the deprecation of these objects: new objects providing equivalent or superior functionality are defined in MIB-II.
3.2. Display Strings
In the past, there have been misinterpretations of the MIB as to when a string of octets should contain printable characters, meant to be displayed to a human. As a textual convention in the MIB, the datatype
DisplayString ::= OCTET STRING
is introduced. A DisplayString is restricted to the NVT ASCII character set, as defined in pages 10-11 of [6].
The following objects are now defined in terms of DisplayString:
sysDescr ifDescr
It should be noted that this change has no effect on either the syntax nor semantics of these objects. The use of the DisplayString notation is merely an artifact of the explanatory method used in MIB-II and future MIBs.
Further it should be noted that any object defined in terms of OCTET STRING may contain arbitrary binary data, in which each octet may take any value from 0 to 255 (decimal).
3.3. Physical Addresses
As a further, textual convention in the MIB, the datatype
PhysAddress ::= OCTET STRING
is introduced to represent media- or physical-level addresses.
The following objects are now defined in terms of PhysAddress:
ifPhysAddress atPhysAddress ipNetToMediaPhysAddress
SNMP Working Group Page 4
RFC 1213 MIB-II March 1991
It should be noted that this change has no effect on either the syntax nor semantics of these objects. The use of the PhysAddress notation is merely an artifact of the explanatory method used in MIB-II and future MIBs. ...............
|
如果你想成为网络方面的专家,那么RFC无疑是最重要也是最经常需要用到的资料之一,所以RFC享有网络知识圣经之美誉。
通常,当某家机构或团体开发出了一套标准或提出对某种标准的设想,想要征询外界的意见时,就会在Internet上发放一份RFC,
对这一问题感兴趣的人可以阅读该RFC并提出自己的意见;绝大部分网络标准的指定都是以RFC的形式开始,
经过大量的论证和修改过程,由主要的标准化组织所指定的,但在RFC中所收录的文件并不都是正在使用或为大家所公认的,
也有很大一部分只在某个局部领域被使用或并没有被采用,一份RFC具体处于什么状态都在文件中作了明确的标识
RFC由一系列草案组成,起始于1969年(第一个RFC文档发布于1969年4月7日,参见“RFC30年”,RFC2555”),
RFC文档是一系列关于Internet(早期为ARPANET)的技术资料汇编。这些文档详细讨论了计算机网络的方方面面,
重点在网络协议,进程,程序,概念以及一些会议纪要,意见,各种观点等。
“RFC编辑者”是RFC文档的出版者,它负责RFC最终文档的编辑审订。“RFC编辑者”也保留有RFC的主文件,称为RFC索引,
用户可以在线检索。在RFC近30年的历史中,“RFC编辑者”一直由约翰?普斯特尔(Jon Postel)来担任,而现在“RFC编辑者”
则由一个工作小组来担任,这个小组受到“因特网社团”(Internet Society)的支助。
RFC编辑者负责RFC以及RFC的整体结构文档,并维护RFC的索引。Internet协议族的文档部分(由Internet工程委员会“因特网工程师任务组”IETF
以及IETF 下属的“因特网工程师指导组”IESG 定义),也做为RFC文档出版。因此,RFC在Internet相关标准中有着重要的地位。
RFC编辑者的职责是由Internet 中的大家提议形成的,所出版的语言也就和Internet一样。IETF和ISOC是代表了世界各地的国际性组织,
英语是IETF的第一工作语言,也是IETF的正式出版语言。RFC 2026 "The Internet Standards Process -- Revision 3" 允许RFC翻译成其他不同的语言。
但是不能保证其翻译版本是否正确。因此,RFC编辑不对非英语的版本负责,而只是指明了哪里有非英语的版本,将这些信息列在WEB页上。
RFC处理过程: 一个RFC文件在成为官方标准前一般至少要经历三个阶段:建议标准、草案标准、因特网标准。 第一步RFC的出版是作为一个Internet 草案发布,可以阅读并对其进行注释。准备一个RFC草案,我们要求作者先阅读IETF的一个文档"Considerations for Internet Drafts". 它包括了许多关于RFC以及Internet草案格式的有用信息。作者还应阅读另外一个相关的文档RFC 2223 "Instructions to Authors"。
一旦文档有了一个ID号后,你就可以向rfc-editor@rfc-editor.org发送e-mail ,说你觉得这个文档还可以,能够作为一个有价值或有经验的RFC文档 。RFC编辑将会向IESG请求查阅该文档并给其加上评论和注释。你可以通过RFC队列来了解你的文档的进度。一旦你的文档获得通过,RFC编辑就会将其编辑并出版。如果该文档不能出版,则会有email通知作者是什么原因。作者有48个小时来校对RFC编辑的意见。我们强烈建议作者要检测拼写错误和丢字的错误,应该确保有引用,联系和更新相关的信息。如你的文档是一个MIB,我们则要你对你的代码作最后一次检测。一旦RFC文档出版,我们就不会对其进行更改,因此你应该对你的文档仔细的检查。
有时个别的文档会被正从事同一个项目的IETF工作组收回,如是这种情况,则该作者会被要求和IETF进行该文档的开发。在IETF中, Area Directors (ADs) 负责相关的几个工作组。这些工作者所开发的文档将由ADs 进行校阅,然后才作为RFC的出版物。 如要获得关于如何写RFC文档和关于RFC的Internet标准制定过程的更多详细信息,请各位参见:
RFC 2223 "Instructions to RFC Authors"。
RFC 2026 "The Internet Standards Process -- Revision 3"。
实际上,在Internet上,任何一个用户都可以对Internet某一领域的问题提出自己的解决方案或规范,作为Internet草案(Internet Draffs,ID)提交给Internet工程任务组(IETF)。草案存放在美国、欧洲和亚太地区的工作文件站点上,供世界多国自愿参加的IETF成员进行讨论、测试和审查。最后,由Internet工程指导组(IESG)确定该草案是否能成为Internet的标准。
如果一个Internet草案在IETF的相关站点上存在6个月后仍未被IESG建议作为标准发布,则它将被从上述站点中删除。事实上,在任何时候,一个Internet 草案都有可能被新的草案版本所替换掉,并重新开始6个月的存放期。 如果一个Internet草案被IESG确定为Internet的正式工作文件,则被提交给Internet体系结构委员会(IAB),并形成具有顺序编号的RFC文档,由Internet协会(ISOC)通过Internet向全世界颁布。每个Internet标准文件在被批准后都会分配一个独立于RFC的永久编号,这就是STD编号。有一个不断被更新的文件RFC-INDEX.TXT按照RFC的编号来索引所有的文件,对于因特网标准文件还列出了其相应的STD编号。 RFC文档必须被分配RFC编号后才能在网络上发布。例如,RFC2026的内容是“Internet标准进程-修订版3”、RFC1543的内容为“RFC作者指导”等等。需要时,可以复制或打印这些联机文档。用户也可以通过遍布全世界的数个联机资料数据库中获得RFC文档。例如,可以使用路径名RFC/RFCnnnn.TXT通过FTP的方式从ds.internic.net站点获得RFC,其中“nnnn”指的是RFC的编号。在这里,使用FTP登录时,所用的用户名和口令分别为“anonymous”和你的电子邮件地址。此外,用户还可以通过Internet网络信息中心(InterNIC)的目录服务功能、电子邮件、WWW等方式获得RFC文档.
作为标准的RFC又分为几种,第一种是提议性的,就是说建议采用这个作为一个方案摆出来,Draft是已经有一部分在用了,希望被采用为正式的标准,还有一种就是完全被认可的标准,这种是大家都在用,而且是不应该改变的。还有一种就是现在的最佳实践法,它相当于一种介绍。这些文件产生的过程是一种从下往上的过程,而不是从上往下,也就是说不是一个由主席,或者由工作组负责人的给一个指令,说是要做什么,要做什么,而是有下边自发的提出,然后在工作组里边讨论,讨论了以后再交给刚才说的工程指导委员会进行审查。但是工程指导委员会只做审查不做修改,修改还是要打回到工作组来做。IETF工作组文件的产生就是任何人都可以来参加会议,任何人都可以提议,然后他和别人进行讨论,大家形成了一个共识就可以产出这样的文件。 | January 29
 fcaps是国际电联的标准模型,为企业管理水平。
The five FCAPS domains are:五fcaps领域分别是:
F ault Management f ault 故障管理
C onfiguration Management 配置管理
A ccounting Management A ccounting 计费管理
P erformance Management p erformance 性能管理
S ecurity Management 安全管理
Fault Management故障管理
Fault management is the domain where network problems are discovered and corrected.故障管理是域网络的地方,发现问题和纠正。
Steps are then taken to prevent them from occurring or recurring.步骤,然后采取,以防止他们发生或复发。
By doing so, the network remains operational and downtime is minimized.这样,网络仍然是业务和停机时间减少到最低限度。
Configuration Management配置管理
Configuration management is where daily operations are monitored and controlled.配置管理是日常运作进行监控和控制。
All hardware and programming changes are coordinated.所有的硬件和节目的变化,重视协调发展。
In addition, new programs, new equipment, modification of existing systems and the removal of obsolete systems and programs are also coordinated.此外,新节目,新设备,改造现有的制度和去除过时的制度和程序也相协调。
Accounting Management 计费管理
Accounting management is devoted to determining how to optimally distribute resources among enterprise subscribers.会计管理,是专门以确定如何以最佳方式分配资源,其中企业用户。
This helps to minimize the cost of operations by making the most effective use of the systems available.这有利于最大限度地减少经营成本,使最有效地利用该系统提供的。
This level is also responsible for ensuring the appropriate billing of users.这一级也有责任确保适当的计费用户。
Performance Management 性能管理
Performance management is involved in managing the overall performance of the enterprise network.绩效管理是参与管理的整体表现,企业网络。 Potential problems are identified, throughput is maximized and bottlenecks are identified.潜在问题,确定后,吞吐量最大化和瓶颈确定。 Improvements that will yield the greatest enhancement to overall performance are identified.改善,将能取得最大的提升,以整体表现确定。
Security Management安全管理
Security management is responsible for protecting the network from unauthorized users and physical and electronic sabotage.安全管理是负责保护网络免受未经授权的用户和物理和电子破坏。
Security management is responsible for user authentication and authorization.安全管理部门负责用户认证和授权。
It also maintains the confidentiality of user information.它也保持了保密的用户信息。
December 19 __\\\今天天气很好, 二部老大请吃饭(公司乔迁新址时慰问劳动的兄弟们), 我也是其中的一份子就参加了这个patrol的小聚; 总的感觉今天的心情还好了, 就是在公司里天天由于新装修可能是装修的油漆味道没散发完吧, 天天熏的头疼~! 不过还好了, 头疼的时候打开窗户, 吹吹就好点了~! 吃饭也吃的稠糊, 呵呵, 大家也挺高兴的~! 这个中午就这么过去了......下午回到公司坐了下来, 刚打开电脑~!
奇迹发生: 任务栏下方出现新的提示: "你可能是windows盗版受害者" 这是我第二次系统自动更新是出现这个问题了~! ||
问题解决分两步:
1)cmd => regedit 打开注册表: 删除系统这个提示的注册表项,具体位置在:
HKEY_LOCAL_MACHINE \SOFTWARE \Microsoft \Windows
NT \CurrentVersion \Winlogon \Notify \WgaLogon
到这项下(就是我们要找的注册表所在项),全部删除,刷新注册表,重新启动系统;
2)重新启动了系统后, 然后把垃圾的文件删除干净: 把系统盘:\windows\system32中的wgatray.exe
删除,还有wgatray.dll 文件相关的文件都删除干净;
___///最好再f8模式安全模式下搜索下其他的wgatray相关文件统统删除;
___\\\这样的话,我们要的效果就完成了, 烦人的"盗版受害者" 的提示也彻底清楚了, 下午就可以好好的工作了~!!!!!!!! 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;
|