分类:
2008-10-15 16:25:19
现今,大多数人会将软件开发视为一项创造性甚至艺术性的工作,目标是使开发出的软件不仅功能强大,而且在某些方面出色、有用且设计良好。然而,IT 专业人员不时被要求扮演“执行者”的角色,这更类似于爵士音乐家。一个出色的爵士音乐家可以选择符合给定环境的正确音符 — 并使它看上去很流畅。通过彻底理解脚本技术,您可以同样快速地创建简单的命令、语句或程序,以便有效地解决业务或技术问题。它们提供的服务非常有价值并且很简单。
针对 Linux 的 数据库版本在 1998 年发布,自那以后,陆续推出了可以在 Linux 上使用的其他 应用产品和中间件。随着 Oracle 坚不可摧 Linux 支持计划的实行,许多组织将他们的 Oracle 安装移植到了 Linux 平台。这些变化导致越来越多的 DBA 需要调查资源(如脚本),以便管理在 Linux 上运行的。
在前面的文章中,我说过,系统管理员与 DBA 之间在职责方面存在一个传统的差异,但实际情况中,这个差异并不明显。公司会雇佣一些可以解决数据库级以及操作系统级问题的员工。至少,安装 Oracle 数据库软件的职责要求 DBA 与底层操作系统进行交互。
即使出现了许多新的脚本语言,管理员仍然需要使用 shell 脚本作为可在所有系统上使用的技术。现有脚本已经开发并在许多上运行了数年 — 这些脚本需要维护和升级。Shell 脚本是一个针对各类 IT 专业人员的非常有用的工具。
在本文中,您将了解 Oracle SQL、Linux 操作系统命令和脚本的一些可转换的常用概念。特别是,本文将说明如何使用“面向集的”方法看待与需要分组、排序和筛选的数据集相关的问题。这些操作对于了解 SQL 的人员来说很熟悉,但在使用 Linux 命令和/或 Ruby 编程语言时,通常也需要这些操作。
我不会尝试以任何严谨的方式讨论数学集合论,而是在整个范围内查找人类语言中存在的所有模糊边界(以及典型业务问题)。Oracle SQL 提供了比脚本更纯粹的数据集操作方式:每一列都包含已定义类型的域,并且逻辑数据独立于底层物理表示进行处理。正常情况下,从查询返回的数据与 shell 命令的输出不同。以下内容针对教学目的,即,为了解 SQL 的人员提供他们所熟知的类比,以便在需要时利用他们解决问题的能力在数据库外部工作。本文将提供一个解决问题的不同角度,并鼓励您钻研新的、不熟悉的领域。
数据集SQL 不是过程语言。相反,它用于查看、汇总或操作数据集。然而,执行某些 shell 命令会导致输出被写入。这些结果也可以解释为一组数据。它可能不是特别结构化的数据集,但大多数情况下都是。许多不同的 shell 命令会将一组数据作为输出,但以下示例将使用 ls 命令,大多数用户应该熟悉这个命令。后续命令将修改给定目录中的文件列表。首先是一个简单的长列表命令:
ls -l最终输出取决于您的目录。假设结果如下:
total 60K -rw-r--r-- 1 root dba 1.7K May 13 09:02 xe_s000_2072.trc -rw-r--r-- 1 cas dba 929 Apr 28 22:21 xe_smon_3664.trc -rw-r--r-- 1 cas dba 794 Apr 26 17:19 xe_smon_3676.trc -rw-r--r-- 1 oracle dba 792 Apr 23 21:52 xe_smon_2120.trc -rw-r--r-- 1 oracle dba 794 Apr 19 17:37 xe_smon_3364.trc -rw-r--r-- 1 root dba 5.5K Jun 20 2006 xe_s000_2412.trc -rw-r--r-- 1 cas dba 790 May 25 2006 xe_smon_540.trc第一列包含一组目录权限。第二列显示链接数量。第三列指明所有者。第四列表示相关组。第五列指出文件大小(以字节为单位)。第六列是文件创建日期(会导致某些问题;如下所示)。第七列指出文件名称。
可以使用一个表来容纳这些数据:
FILE_PERMISSIONS | NUM_LINKS | FILE_OWNER | FILE_GROUP | SIZE | CREATED_AT | FILE_NAME |
-rw-r--r-- | 1 | root | dba | 1675 | May 13 09:02 | xe_s000_2072.trc |
-rw-r--r-- | 1 | root | dba | 5532 | Jun 20 2006 | xe_s000_2412.trc |
-rw-r--r-- | 1 | oracle | dba | 792 | Apr 23 21:52 | xe_smon_2120.trc |
-rw-r--r-- | 1 | oracle | dba | 794 | Apr 19 17:37 | xe_smon_3364.trc |
-rw-r--r-- | 1 | cas | Dba | 929 | Apr 28 22:21 | xe_smon_3664.trc |
-rw-r--r-- | 1 | cas | dba | 794 | Apr 26 17:19 | xe_smon_3676.trc |
-rw-r--r-- | 1 | cas | dba | 790 | May 25 2006 | xe_smon_540.trc |
后面的示例将构建这个结果的“虚构表”(ls -l 命令的输出已在上面列出),以说明如何限制、排序和汇总数据。
注意事项至少对于查看数据的人来说,这个数据集的结构很明显。然而,请注意第一行与结构不符:total 60K。这一开始就显示了方法的局限性;某些输出不是结构化数据的一部分。要整理这组数据,您可以将输出重定向到一个文件,随后可以通过后续命令操作这个文件。 ls -l > test.txt然后,您可以使用喜欢的文本编辑器编辑该文件,并删除第一行。您可以调整数据,直到满足您的结构化要求。结构化程度取决于您的目标对象。可读报表不同于要加载到 Oracle 表中的文件。 如果这个手动中间步骤不是一个选项(或破坏了您的自动化体验),请考虑使用 grep -v 选项(本文稍后有述)传送输出。该命令用于排除匹配给定模式的行。 您可能还注意到,日期格式不一致。除了以几个不同的格式显示之外,也不能进行临时排序,并且还包含了空格。这再一次展示了数据库类型化数据的有用性。Oracle 提供了大量函数,用于操作和排序日期。在数据库中,将日期作为结构化数据通常更易于操作。 如果必须在命令行按日期排序,您可能还需要 -t 或类似选项,以便在传送给后续命令之前进行此排序。 |
[1]