Android SDK 2.3与Eclipse最新版开发环境搭建(五)

七、
第一个Android应用(HelloAndroid
World!

  1. 新建项目:打开Eclipse,选择 File > New >
    Project > Android Project,具体输入如下图:

clip_image002

  1. 点击“Next”,提示如下:

clip_image004

  1. 这里仅为演示,不创建测试项目。直接点击“Finish”按钮即可。

clip_image006

  1. 编辑HelloAndroidWorld.java文件,内容如下:

package org.deaboway.test;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class HelloAndroidWorld extends
Activity {

@Override

public void onCreate(Bundle savedInstanceState)
{

super.onCreate(savedInstanceState);

TextView textView = new TextView(this);

textView.setText(“Hello Android World!”);

setContentView(textView);

}

}

  1. 运行Android项目:点击工具栏的运行按钮,或选择菜单:Run->Run,或右键项目文件夹,会弹出“Run
    As”对话框,选择“Android Application”,点击“OK”按钮。

clip_image008

  1. 运行效果如下,AVD加载的速度有些慢,需要耐心等待。

clip_image010

  1. 同时,Eclipse的控制台也会打印出运行时的一些相关信息,如下。

clip_image012

Android SDK 2.3与Eclipse最新版开发环境搭建(四)

五、 Eclipse ADT配置

ADT的Eclipse
Plugin
安装成功之后,开始ADT的配置,具体如下:

1. Eclipse重启后,选择Window >
Preferences…,在打开的属性框,选择Android,可以看到:

clip_image002

2. 在SDK location中输入你的Android SDK所在的目录,然后按 Apply按钮
即可看到我们安装SDK包,如下图:

clip_image004

至此,Eclipse+ADT的集成开发环境就安装配置完毕。

六、 Android SDK配置

这里介绍下新建AVD。所谓AVD,即Android Virtual Devices
,Android虚拟设备,亦即嵌入式开发中常用的模拟器。

  1. 在Eclipse中选择 Window-Android SDK and AVD Manager
    ,或者在android-sdk-windows文件夹中双击SDK Manager.exe,可以看到类似如下界面:

clip_image006

注:这里可以看到小生已经创建过两个AVD,其实这两个AVD并不是在本文下载安装的Android
SDK
中配置的,但是由于所有的AVD配置信息都是存储在当前用户的home中,如:C:\Documents
and Settings\Administrator\.android\avd
。因此,这里也可以看到。

  1. 在弹出的 Android SDK and AVD Manager对话框,选择 Virtual Devices,按new 按钮
    创建虚拟设备,输入如下图所示:

clip_image008

其中:

  • Target:SDK的类型
  • SD card:SD卡的大小
  • Skin:显示屏的类型
  1. 点击“Create AVD”按钮,如果安装成功,会在“Android SDK and AVD
    Manager”对话框中显示。

clip_image010

至此开发环境配置完成,接下来即可以进行Android上应用的开发。

Android SDK 2.3与Eclipse最新版开发环境搭建(三)

四、 Eclipse集成开发环境(IDE)搭建

现在开始Eclipse IDE及Android Eclipse
plugin的安装和配置,这里使用的Eclipse版本为,eclipse-java-helios-SR1-win32.zip,请自行到Eclipse官方网站(http://eclipse.org)上下载自己喜欢的版本,建议3.4以上版本。

我们使用的Android Eclipse Plugin是ADT:Android
Development Tools
。同Android
SDK
一样,分为在线安装和手动安装两种方式。

在线安装步骤如下:

  1. 打开Eclipse,选择菜单:Help->Install New
    Software…

clip_image001

  1. 弹出“Available Software”对话框,点击“Add…”按钮

clip_image003

  1. 弹出“Add Repository”对话框。

Name中输入:ADT

Location中输入:https://dl-ssl.google.com/android/eclipse/,如果不支持https可有输入http://dl-ssl.google.com/android/eclipse/

如下图:

clip_image005

点击“OK”按钮。

  1. 此时Eclipse会搜索指定URL的资源,如果搜索无误,会出现:Developer
    Tools的复选框,选中此复选框。点击“Next”按钮。

clip_image007

  1. 出现“Install Details”对话框。点击“Next”按钮。

clip_image009

  1. 出现“Review Licenses”对话框,选择“I accept the terms of the license
    agreements”复选框。点击“Finish”按钮。

clip_image011

  1. 进入下载及安装过程:

clip_image013

  1. 过程中可能会出现“Security Warning”对话框,不用担心点击“OK”按钮以继续安装。

clip_image015

  1. 安装成功后,安装提示重启Eclipse,即完成整个安装过程。

clip_image017

离线安装步骤如下;

1.
访问http://androidappdocs.appspot.com/sdk/eclipse-adt.html获取当前最新版本的ADT
Eclipse离线安装包,当前最新版本为:ADT
9.0.0,下载地址为:http://dl.google.com/android/ADT_9.0.0.zip

2. 开始Eclipse Plugin的本地安装过程中,如下。由于整个过程跟在线安装类似,具体不再详述。

clip_image019

Android SDK 2.3与Eclipse最新版开发环境搭建(二)

三、 Android SDK安装

Android
SDK
可以通过SDK下载器自动下载和配置,适合网络好,下载速度快的情况下;也可以借助工具下载SDK文件,手工配置,适合网络不是很好,下载速度慢的情况下。

SDK下载器自动下载步骤如下:

  1. 解压缩android-sdk_r08-windows下载器,并双击运行SDK Manager.exe:

clip_image002

如果你的电脑不支持https连接会看到如下界面:

clip_image004

请选择setting的将Force https://… Sources to be fetched by using
http://… 的选项打勾

clip_image006

  1. 勾选你想要安装的Packages,并点击Install Selected进行安装:

clip_image008

  1. 确认对话框如下,选择Accept All进行下载安装

clip_image010

  1. 则Android SDK下载器进入下载安装的过程

clip_image012

  1. 根据你网速的情况,下载安装的时间或长或短,请耐心等待。

手动下载步骤如下:

  1. 通过分析Android下载器的http://dl-ssl.google.com/android/repository/repository.xml
    内容,可以得到如下下载列表(以Windows环境为例):

http://dl-ssl.google.com/android/repository/android-1.5_r04-windows.zip

http://dl-ssl.google.com/android/repository/android-1.6_r03-windows.zip

http://dl-ssl.google.com/android/repository/android-2.0_r01-windows.zip

http://dl-ssl.google.com/android/repository/android-2.0.1_r01-windows.zip

http://dl-ssl.google.com/android/repository/android-2.1_r02-windows.zip

http://dl-ssl.google.com/android/repository/android-2.2_r02-windows.zip

http://dl-ssl.google.com/android/repository/android-2.3.1_r02-linux.zip

http://dl-ssl.google.com/android/repository/android-3.0_pre_r01-linux.zip

http://dl-ssl.google.com/android/repository/platform-tools_r02-windows.zip

http://dl-ssl.google.com/android/repository/tools_r09-windows.zip

http://dl-ssl.google.com/android/repository/docs-Honeycomb_pre_r01-linux.zip

http://dl-ssl.google.com/android/repository/samples-Honeycomb_pre_r01-linux.zip

http://dl-ssl.google.com/android/repository/samples-2.1_r01-linux.zip

http://dl-ssl.google.com/android/repository/samples-2.2_r01-linux.zip

http://dl-ssl.google.com/android/repository/samples-2.3_r01-linux.zip

  1. 请使用下载工具下载到本地,并按如下映射关系解压缩到SDK下载器所在目录,映射关系如下:
android-1.5_r04-windows.zipplatforms\android-3
android-1.6_r03-windows.zipplatforms\android-4
android-2.0_r01-windows.zipplatforms\android-5
android-2.0.1_r01-windows.zipplatforms\android-6
android-2.1_r02-windows.zipplatforms\android-7
android-2.2_r02-windows.zipplatforms\android-8
android-2.3.1_r02-linux.zipplatforms\android-9
android-3.0_pre_r01-linux.zipplatforms\android-10
platform-tools_r02-windows.zipplatforms-tools
tools_r09-windows.ziptools
docs-Honeycomb_pre_r01-linux.zipdoc
samples-Honeycomb_pre_r01-linux.zipsamples\android-10
samples-2.1_r01-linux.zipsamples\android-7
samples-2.2_r01-linux.zipsamples\android-8
samples-2.3_r01-linux.zipsamples\android-9

 

  1. 如果要安装google api,请分析下图中的地址:http://dl-ssl.google.com/android/repository/addon.xml
    下载自己需要的Packages进行解压,方法同1、2

clip_image014

下载列表为:

http://dl-ssl.google.com/android/repository/google_apis-3-r03.zip

http://dl-ssl.google.com/android/repository/google_apis-4_r02.zip

http://dl-ssl.google.com/android/repository/google_apis-5_r01.zip

http://dl-ssl.google.com/android/repository/google_apis-6_r01.zip

http://dl-ssl.google.com/android/repository/google_apis-7_r01.zip

http://dl-ssl.google.com/android/repository/google_apis-8_r02.zip

http://dl-ssl.google.com/android/repository/google_apis-9_r02.zip

http://dl-ssl.google.com/android/repository/market_licensing-r01.zip

http://dl-ssl.google.com/android/repository/usb_driver_r04-windows.zip

  1. 映射关系为:
google_apis-3-r03.zip add-ons\addon_google_apis_google_inc_3
google_apis-4_r02.zip add-ons\addon_google_apis_google_inc_4
google_apis-5_r01.zip add-ons\addon_google_apis_google_inc_5
google_apis-6_r01.zip add-ons\addon_google_apis_google_inc_6
google_apis-7_r01.zip add-ons\addon_google_apis_google_inc_7
google_apis-8_r02.zip add-ons\addon_google_apis_google_inc_8
google_apis-9_r02.zip add-ons\addon_google_apis_google_inc_9
market_licensing-r01.zipgoogle-market_licensing
usb_driver_r04-windows.zipusb_driver

 

  1. 具体的目录结构如下图:

clip_image016

  1. 解压完成后启动一下SDK下载器,检查是否安装成功,如下图:

clip_image018

注:由于小生在写这篇文章的时候,Android刚出了Android SDK Platform
Honeycomb Preview, revision
1
,但是却没有把android-3.0_pre_r01-linux.zip放在http://dl-ssl.google.com/android/repository/android-3.0_pre_r01-linux.zip,所以暂时无法下载安装这个版本的Android
SDK
,但不影响SDK使用。请各位自行下载安装。

Android SDK 2.3与Eclipse最新版开发环境搭建(一)

一、 背景和准备

1. Android简介

Android是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。可以把它简单理解成Linux上套了一个JAVA的壳。

Android 的平台基本上是免费的,虽然有部份原生链接库会要求费用,但大部份是免权利金。Android
的程序可以采用JAVA开发,因为它的虚拟机(Virtual Machine) Dalvik,只是它将JAVA的bytecode
转成自己的格式,回避掉需要付给SUN 有关JAVA 的授权费用。因此,Android 开发环境是需要JDK的。

2. Android 网络资源

Android的网站是:http://www.android.com/,目前还可以登陆,比较悲剧的是:其Partners部分:http://source.android.com/和Developers部分:http://developer.android.com/,大陆地区已经无法访问。

Android的系统要求请参考:http://androidappdocs.appspot.com/sdk/requirements.html

当前最新版本的Android SDK下载器(真正的SDK还是需要另外下载的),小生是无法直接到官网http://developer.android.com/sdk/index.html
下载的,于是另外找了一个地址http://androidappdocs.appspot.com/sdk/index.html,下载链接和说明如下:

Android SDK for Windows
android-sdk_r08-windows.zip
http://dl.google.com/android/android-sdk_r08-windows.zip

installer_r08-windows.exe (Recommended)
http://dl.google.com/android/installer_r08-windows.exe
Android SDK for Mac OS X (intel)
android-sdk_r08-mac_86.zip
http://dl.google.com/android/android-sdk_r08-mac_86.zip
Android SDK for Linux (i386)
android-sdk_r08-linux_86.tgz
http://dl.google.com/android/android-sdk_r08-linux_86.tgz

Here’s an overview of the steps you must follow to set up the
Android SDK:
   1. Prepare your development
computer and ensure it meets the system requirements.
   2. Install the SDK starter
package from the table above. (If you’re on Windows, download the
installer for help with the initial setup.)
   3. Install the ADT Plugin for
Eclipse (if you’ll be developing in Eclipse).
   4. Add Android platforms and
other components to your SDK.
   5. Explore the contents of the
Android SDK (optional).

3. 软件包下载

a. JDK 1.6

下载网址:
http://www.oracle.com/technetwork/java/javase/downloads/index.html

当前最新版本为Java SE 6 Update 23

小生机器上安装的是:jdk1.6.0_21,也一样用,其实只要你是JDK1.5以上就可以了。

b. Android SDK下载器

下载地址上面已经给出了,可以根据你的系统选择不同的安装包。小生是windows 2003
server,因此下载了http://dl.google.com/android/android-sdk_r08-windows.zip,之后直接解压缩即可。

c. Eclipse IDE

Eclipse 3.4 (Ganymede)以后版本均可。小生下载了最新版本的Helios (3.6)

二、 JAVA环境

Windows上配置JAVA环境变量如下:

JAVA_HOME

clip_image002

Path:

clip_image004

Android是什么

一、简介

黑莓和 iPhone
都提供了受欢迎的、高容量的移动平台,但是却分别针对两个不同的消费群体。黑莓是企业业务用户的不二选择。但是,作为一种消费设备,它在易用性和
“新奇特性” 方面难以和 iPhone 抗衡。Android
则是一个年轻的、有待开发的平台,它有潜力同时涵盖移动电话的两个不同消费群体,甚至可能缩小工作和娱乐之间的差别

如今,很多基于网络或有网络支持的设备都运行某种 Linux
内核。这是一种可靠的平台:可经济有效地进行部署和提供支持,并且可直接作为面向部署的良好的设计方法。这些设备的 UI 通常是基于
HTML 的,可通过 PC 或 Mac
浏览器查看。但并不是每个设备都需要通过一个常规的计算设备来控制。想象一下传统的家用电器,例如电炉、微波炉或面包机。如果您的家用电器由
Android 控制,并且有一个彩色触摸屏,会怎么样?如果电炉上有一个 Android
UI,那么操控者甚至可以烹饪点什么东西。

二、Android术语

在 Eclipse 环境中开发 Android 应用程序需要了解 Eclipse 环境和 Android
平台的知识。了解以下术语会有助于用 Eclipse 插件开发 Android 应用程序。

Open Handset Alliance

这是一个由 Google 公司主导的组织,它由许多公共和私人组织组成。

Android

这是 Open Handset Alliance 的主打产品。它是一种针对移动设备的开放源码操作环境。

模拟器

模拟另一个系统的软件工具 —
这常常是在个人计算机(IBM®、Mac、Linux®)上运行的一个环境,它模拟另一个环境,比如移动计算设备。

Linux

一种开放源码的操作系统内核,许多计算平台都使用这种操作系统,包括服务器、桌面计算机、网络设备和移动计算设备。Android 在
Linux 内核上运行。

Dalvik Virtual Machine

Dalvik VM 是 Android 产品组合中的一种操作环境,它在运行时解释应用程序代码。Dalvik VM 与 Java
VM 相似,但是两者不兼容。

三、Android简史

Android 平台是 Open Handset Alliance 的成果,Open Handset
Alliance 组织由一群共同致力于构建更好的移动电话的公司组成。这个组织由 Google
领导,包括移动运营商、手持设备制造商、零部件制造商、软件解决方案和平台提供商以及市场营销公司。从软件开发的观点看,Android
正处在开源领域的中心位置。

市场上第一款支持 Android 的手机是由 HTC 制造并由 T-Mobile 供应的
G1。这款设备从设想到推出花了大约一年的时间,惟一可用的软件开发工具是一些实行增量改进的 SDK 发行版。随着 G1
发行日的临近,Android 团队发布了 SDK V1.0,用于这个新平台的应用程序也浮出水面。

为了鼓励创新,Google 举办了两届 “Android Developer
Challenges”,为优胜的参赛作品提供数百万美金的奖励。G1 问世几个月之后,随后就发布了 Android
Market,它使用户可以浏览应用程序,并且可以将应用程序直接下载到他们的手机上。经过大约 18
个月,一个新的移动平台进入公众领域。

四、Android平台

Android 平台被称为一个产品组合,因为它是一系列组件的集合,包括:

  • 基于 Linux 内核的操作系统
  • Java 编程环境
  • 工具集,包括编译器、资源编译器、调试器和模拟器
  • 用来运行应用程序的 Dalvik VM

Android 有丰富的功能,因此很容易与桌面操作系统混淆。Android 是一个分层的环境,构建在 Linux
内核的基础上,它包括丰富的功能。UI 子系统包括:

  • 窗口
  • 视图
  • 用于显示一些常见组件(例如编辑框、列表和下拉列表)的小部件

Android 包括一个构建在 WebKit 基础上的可嵌入浏览器,iPhone 的 Mobile Safari
浏览器同样也是以 WebKit 为基础。

Android 提供多种连接选项,包括 WiFi、蓝牙和通过蜂窝(cellular)连接的无线数据传输(例如 GPRS、EDGE
和 3G)。Android 应用程序中一项流行的技术是链接到 Google 地图,以便在应用程序中显示地址。Android
软件栈还提供对基于位置的服务(例如 GPS)和加速计的支持,不过并不是所有的 Android
设备都配备了必需的硬件。另外还有摄像支持。

过去,移动应用程序努力向桌面应用程序看齐的两个领域分别是图形/媒体和数据存储方法。Android 通过提供对 2D 和 3D
图形的内置支持,包括 OpenGL 库,解决了图形方面的挑战。由于 Android 平台包括流行的开源 SQLite
数据库,因此缓解了数据存储的负担。图 1显示一个简化的 Android 软件层次结构。

1. Android 软件层次结构

clip_image001[1]

五、应用程序架构

如前所述,Android 运行在 Linux 内核上。Android 应用程序是用 Java
编程语言编写的,它们在一个虚拟机(VM)中运行。需要注意的是,这个 VM 并非您想象中的 JVM,而是 Dalvik Virtual
Machine,这是一种开源技术。每个 Android 应用程序都在 Dalvik VM 的一个实例中运行,这个实例驻留在一个由
Linux 内核管理的进程中,如下图所示。

2. Dalvik VM

clip_image002[1]

Android 应用程序由一个或多个组件组成:

活动

具有可视 UI 的应用程序是用活动实现的。当用户从主屏幕或应用程序启动器选择一个应用程序时,就会开始一个动作。

服务

服务应该用于任何需要持续较长时间的应用程序,例如网络监视器或更新检查应用程序。

内容提供程序

可以将内容提供程序看作数据库服务器。内容提供程序的任务是管理对持久数据的访问,例如 SQLite
数据库。如果应用程序非常简单,那么可能不需要创建内容提供程序。如果要构建一个较大的应用程序,或者构建需要为多个活动或应用程序提供数据的应用程序,那么可以使用内容提供程序实现数据访问。

广播接收器

Android 应用程序可用于处理一个数据元素,或者对一个事件(例如接收文本消息)做出响应。

Android 应用程序是连同一个 AndroidManifest.xml
文件一起部署到设备的。AndroidManifest.xml
包含必要的配置信息,以便将它适当地安装到设备。它包括必需的类名和应用程序能够处理的事件类型,以及运行应用程序所需的许可。例如,如果应用程序需要访问网络
— 例如为了下载一个文件 — 那么 manifest
文件中必须显式地列出该许可。很多应用程序可能启用了这个特定的许可。这种声明式安全性有助于减少恶意应用程序损害设备的可能性。

六、所需工具

开始开发 Android 应用程序的最简捷的方式是下载 Android SDK 和 Eclipse IDE。Android
开发可以在 Microsoft® Windows®、Mac OS X 或 Linux 上进行。

本文假设您使用的是 Eclipse IDE 和用于 Eclipse 的 Android Developer Tools
插件。Android 应用程序是用 Java 语言编写的,但是是在 Dalvik VM(非 Java 虚拟机)中编译和执行的。在
Eclipse 中用 Java 语言编程非常简单;Eclipse 提供一个丰富的 Java
环境,包括上下文敏感帮助和代码提示。Java 代码通过编译后,Android Developer Tools
可确保适当地将它打包,包括 AndroidManifest.xml 文件。

虽然没有 Eclipse 和 Android Developer Tools 插件也可以开发 Android
应用程序,但是那样就需要熟悉 Android SDK。

Android SDK 是作为一个 ZIP 文件发布的,可以将该文件解压到硬盘上的一个目录中。由于有多个 SDK
更新,建议有意识地组织开发环境,以便在不同的 SDK 安装之间轻松地切换。SDK 包括:

android.jar

Java 归档文件,其中包含构建应用程序所需的所有的 Android SDK 类。

documention.html docs 目录

本地和网上提供的 SDK 文档。这些文档的主要形式为 JavaDocs,以便于在 SDK
中导航大量的包。文档还包括一个高级开发指南和 Android 社区的链接。

Samples 目录

samples 子目录包含各种应用程序的源代码,包括 ApiDemo,该应用程序演示了很多 API。这个示例应用程序可以作为
Android 应用程序开发的良好起点。

Tools 目录

包含所有用于构建 Android 应用程序的命令行工具。最常用、最有用的工具是 adb 实用程序(Android Debug
Bridge)。

usb_driver

该目录包含将开发环境连接到支持 Android 的设备(例如 G1 或 Android Dev 1
解锁开发手机)所需的驱动程序。只有 Windows 平台的开发人员才需要这些文件。

Android 应用程序可以在实际的设备上运行,也可以在 Android SDK 附带的 Android Emulator
上运行。图 3 显示 Android Emulator 的主屏幕。

图 3. Android Emulator

clip_image004[1]

七、Android Debug Bridge

adb 实用程序支持一些可选命令行参数,以提供强大的特性,例如复制文件到设备或从设备复制文件。可以使用 shell
命令行参数连接到手机本身,并发送基本的 shell 命令。图 4 显示在通过 USB 线连接到 Windows
笔记本电脑的一个实际设备上运行的 adb shell 命令。

4. 使用 adb shell
命令

clip_image005[1]

在这个 shell 环境中,可以:

  • 显示网络配置,网络配置可显示多个网络连接。注意这多个网络连接:
    • lo 是本地或 loopback 连接。
    • tiwlan0 是 WiFi 连接,该连接由本地 DHCP 服务器提供一个地址。
  • 显示 PATH 环境变量的内容。
  • 执行 su 命令,以成为超级用户。
  • 将目录改为 /data/app,其中存放用户应用程序。
  • 列出包含某个应用程序的目录。Android 应用程序文件实际上是归档文件,可通过 WinZip 之类的软件查看。扩展名为
    apk。
  • 发出 ping 命令,查看 Google.com 是否可用。

从相同的命令提示符环境中,还可以与 SQLite
数据库交互,启动程序以及执行许多其他系统级任务。想像一下您正在连接到电话,因此这是非常了不起的功能。

从KVM角度对MIDlet生命周期的剖析

当MIDlet被MIDletSuite载入器载入之后,便开始了它的生命周期.整个生命周期完全由MIDletSuite管理器进行处理.一个MIDlet有3中状态:

      
1.停止状态(Paused)

       2.激活状态(Active)

       3.销毁状态(Destroyed)

      
当MIDlet刚由载入器载入时处于停止状态,由MIDletSuite管理器将其变成激活状态,然后会调用MIDlet的startApp()方法开始MIDlet的执行.下图是MIDlet的3个状态的转换过程图:

从KVM角度对MIDlet生命周期的剖析

       
由上图可以看出MDIlet创建实例之后首先是Paused状态,然后转换成Active状态,并且Active状态和Paused状态可以多次相互转
换.因此,在Active状态时(startApp)不应该处理那些在整个MIDlet周期中只可以初始化一次的资源.

       
对应与MIDlet的3个状态,MDIlet有3个方法:

       
1.startApp()方法:
AMS会调用startApp方法来获取该MIDlet所需要的资源,然后会将MIDlet的状态改变成Active状态.

        2.pauseApp()方法:
AMS在调用该方法后,会释放MIDlet所占用的所有资源.如果此时MIDlet创建了对象,则会对对象进行转存储,并且停止当前所有的活动JAVA线程.

       
3.destroyApp()方法:
ASM调用该方法会释放MIDlet占用的任何资源,然后将管理权交给AMS或者直接退出KVM.

       
下面以MIDlet的启动过程为例,从KVM的角度来分析MIDlet如何创建并且运行的.

        当虚拟机启动之后通过Class.forName方法最先执行的是MIDletSuite载入器,该类完成MIDletSuite执行前所需要资源的初始化工作:

       
1.初始化Security Token

       
2. 初始化MIDletSuite存储类

       
3. 初始化MIDletProxyList

       
4.初始化MIDlet事件监听器

       
5.通过MIDletSuite存储类提供的方法获取JAR包中的主类,生成MIDlet对象.

       
6.调用MIDletSuite管理器开始执行MIDlet并且管理其生命周期.

        
MIDletStateHandler类充当了整个MIDlet的管理器功能,负责状态的管理和调度.MIDletSuite类完成初始化功能之后,调用MIDletStateHandler类邪恶startSuite方法启动MIDlet执行:

       
1.首先startSuite方法会向MIDlet运行队列中注册新的MIDlet

        
2.startSuite方法循环中从MIDlet运行队列中取出优先级最高的MIDlet进行处理.如果当前只有一个MIDlet,则会将其取出,并且
将其状态转换成ACTIVE,然后会调用MIDlet的startApp方法.如果此时用户点击了按钮时间,并且调用了pauseApp()方法,则
startSuite循环中会依据当前MIDlet的状态将其转换成paused状态.同样如果用户激发了destroyApp()方法并且MIDlet
执行队列中没有其他MIDlet可执行,则会回收当前MIDlet所占用的资源,并且退出startSuite中的循环.如果此时MIDlet执行队列中
还有其他MIDlet需要执行,则会在销毁当前MIDlet之后继续调度下一个优先级最高的MIDlet执行.

       
整个MDIlet的产生过程如下图所示:


从KVM角度对MIDlet生命周期的剖析

     
整个MIDlet的执行过程还涉及到事件处理过程和窗口UI的处理过程,这两个过程相对比较复杂,在以后的文章中再进行详细的描述.

~~~~~~ End ~~~~~~

作者: 姜江

BLOG: http://blog.csdn.net/jznsmail

E-Mail: [email protected]

QQ: 457283

[转载]Windows上GAWK的使用(四)

挺好的

原文地址:Windows上GAWK的使用(四)作者:盛奕

 14.5. 条件语句
gawk中的条件语句是从C语言中借鉴过来的,可控制程序的流程。
14.5.1. if语句
格式:
{if (expression_r){
statement; statement; …
}
}
gawk.exe “{if ($1 <$2) print $2 “””too high”””}”
test.txt。如果第一个域小于第二个域则打印。
gawk.exe “{if ($1 < $2) {count++; print “””ok”””}}”
test.txt.如果第一个域小于第二个域,则count加一,并打印ok。
14.5.2. if/else语句,用于双重判断。
格式:
{if (expression_r){
statement; statement; …
}
else{
statement; statement; …
}
}
gawk.exe “{if ($1 > 100) print $1 “””bad””” ; else
print “””ok”””}” test.txt。如果$1大于100则打印$1 bad,否则打印ok。
gawk.exe “{if ($1 > 100){ count++; print $1} else
{count–; print $2}”
test.txt。如果$1大于100,则count加一,并打印$1,否则count减一,并打印$1。
14.5.3. if/else else if语句,用于多重判断。
格式:
{if (expression_r){
statement; statement; …
}
else if (expression_r){
statement; statement; …
}
else if (expression_r){
statement; statement; …
}
else {
statement; statement; …
}
}
14.6. 循环
*
gawk有三种循环:while循环;for循环;special for循环。
*
gawk.exe “{ i = 1; while ( i <= NF ) { print NF,$i;
i++}}”
test.txt。变量的初始值为1,若i小于可等于NF(记录中域的个数),则执行打印语句,且i增加1。直到i的值大于NF.
*
gawk.exe “{for (i = 1; i *
breadkcontinue语句。break用于在满足条件的情况下跳出循环;continue用于在满足条件的情况下忽略后面的语句,直接返回循环的顶端。如:

{for ( x=3; x<=NF; x++)
if ($x<0){print “Bottomed out!”; break}}
{for ( x=3; x<=NF; x++)
if ($x==0){print “Get next item”; continue}}

*
next语句从输入文件中读取一行,然后从头开始执行awk脚本。如:
{if ($1 ~/test.txt/){next}
else {print}
}

*
exit语句用于结束awk程序,但不会略过END块。退出状态为0代表成功,非零值表示出错。
14.7. 数组
awk中的数组的下标可以是数字和字母,称为关联数组。
14.7.1. 下标与关联数组
*
用变量作为数组下标。如:gawk.exe {name[x++]=$2};END{for(i=0;i *
special for循环用于读取关联数组中的元素。格式如下:
{for (item in arrayname){
print arrayname[item]
}
}
gawk.exe “/^tom/{name[NR]=$1}; END{for(i in name){print name[i]}}”
test.txt。打印有值的数组元素。打印的顺序是随机的。
*
用字符串作为下标。如:count[“test.txt”]
*
用域值作为数组的下标。一种新的for循环方式,for (index_value in array)
statement。如:gawk.exe “{count[$1]++} END{for(name in count) print
name,count[name]}”
test.txt。该语句将打印$1中字符串出现的次数。它首先以第一个域作数组count的下标,第一个域变化,索引就变化。
*
delete 函数用于删除数组元素。如:gawk.exe “{line[x++]=$1} END{for(x in line)
delete(line[x])}” test.txt。分配给数组line的是第一个域的值,所有记录处理完成后,special
for循环将删除每一个元素。

gawk awk 手册 命令 大全 详解

gawk 手册

作者:shell phpx (2005-03-30 15:08:35)

 
 GAWK

第一章 前言
第二章 简介
第三章 读取输入档案
第四章 印出
第五章 Patterns
第六章 算式(Expression)作为Actions的叙述
第七章 Actions里面的控制叙述
第八章 内建函式(Built-in Functions)
第九章 使用者定义的函式
第十章 □例
第十一章 结论

=======================================

第一章 前言

awk 是一个程式语言,对於资料的处理具有很强的功能。对於文
字档里的资料做修改、比对、抽取等的处理,awk 能够以很短的程式
轻易地完成。如果使用 C 或 Pascal 等语言写程式完成上述的动作,
会不方便且很花费时间,所写的程式也会很大。

awk 能够依照使用者的定义格式来分解输入资料,也可依照使用
者定义的格式来印出资料。

awk 名称的由来是由它的原始设计者的姓氏之第一个字母而命名
:Alfred V. Aho, Peter J. Weinberger, Brian W. Kernighan。
awk最初在1977年完成。一个新版本的awk在1985年被发表,它的功能
比旧版本增强不少。

gawk 是GNU所做的 awk,gawk 最初在1986年完成,之後不断地
被改进、更新。gawk 包含 awk 的所有功能。

往後的 gawk 将以下面的2个输入档案来做例子说明。

档案’BBS-list’:
aardvark 555-5553 1200/300 B
alpo-net 555-3412 2400/1200/300 A
barfly 555-7685 1200/300 A
bites 555-1675 2400/1200/300 A
camelot 555-0542 300 C
core 555-2912 1200/300 C
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sdace 555-3430 2400/1200/300 A
sabafoo 555-2127 1200/300 C

档案’shipped’:
Jan 13 25 15 115
Feb 15 32 24 226
Mar 15 24 34 228
Apr 31 52 63 420
May 16 34 29 208
Jun 31 42 75 492
Jul 24 34 67 436
Aug 15 34 47 316
Sep 13 55 37 277
Oct 29 54 68 525
Nov 20 87 82 577
Dec 17 35 61 401

Jan 21 36 64 620
Feb 26 58 80 652
Mar 24 75 70 495
Apr 21 70 74 514

第二章 简介

gawk 的主要功能是针对档案的每一行(line)搜寻指定的 patterns
。当一行里有符合指定的 patterns,gawk 就会在此一行执行被指定
的 actions。 gawk 依此方式处理输入档案的每一行直到输入档案结
束。

gawk 程式是由很多的 pattern 与 action 所组成,action 写在
大括号 { } 里面,一个pattern後面就跟著一个action。整个 gawk 程
式会像下面的样子:

pattern {action}
pattern {action}

在 gawk 程式里面的规则,pattern 或 action 能够被省略,但
是两个不能同时被省略。如果 pattern 被省略,对於输入档里面的
每一行,action 都会被执行。如果 action 被省略,内定的 action
则会印出所有符合 pattern 的输入行。

2.1 如何执行gawk程式

基本上,有2个方法可以执行gawk程式。

□如果 gawk 程式很短,则 gawk 可以直接写在 command line,如下所示:

gawk ‘program’ input-file1 input-file2 …

其中 program 包括一些 pattern 和 action。

□如果 gawk 程式较长,较为方便的做法是将 gawk 程式存在一个档案,
即 patterns 与 actions 写在档名为 program-file 的档案里面,执行
gawk 的格式如下所示:

gawk -f program-file input-file1 input-file2 …

gawk 程式的档案不止一个时,执行gawk 的格式如下所示:

gawk -f program-file1 -f program-file2 … input-file1
input-file2 …

2.2 一个简单的例子

现在我们举一个简单的例子,因为 gawk 程式很短,所以将 gawk 程
式直接写在 command line。

gawk ‘/foo/ {print $0}’ BBS-list

实际的 gawk 程式为 /foo/ {print $0}。/foo/ 为 pattern,意思为搜
寻输入档里的每一行是否含有子字串 ‘foo’,如果含有 ‘foo’ 则执行 action。
action 为 print $0,是将现在这一行的内容印出。BBS-list 是输入的档案。

执行完上述指令後,会印出下面的结果:
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sabafoo 555-2127 1200/300 C

2.3 一个较复杂的例子

gawk ‘$1 == “Feb” {sum=$2+$3} END {print sum}’ shipped

现在这个例子会将输入档 ‘shipped’ 的第一个栏位与 “Feb” 做比较
,如果相等,则其对应的第2栏位与第3栏位的值会被加到变数 sum。
对於输入档的每一行重复上述的动作,直到输入档的每一行都被处理
过为止。最後将 sum 的值印出。END {print sum} 的意思为在所有的输
入读完之後,执行一次 print sum 的动作,也就是把 sum 的值印出。

下面是执行的结果:
84

第三章 读取输入档案

gawk的输入可以从标准输入或指定的档案里读取。输入的读取单
位被称为”记录”(records),gawk 在做处理时,是一个记录一个记
录地处理。每个记录的内定值是一行(line),一个记录又被分为多个
栏位(fields)。

3.1 如何将输入分解成记录(records)

gawk 语言会把输入分解成记录(record)。记录与记录之间是以
record separator 隔开,record separator 的内定值是表示新一行的
字元(newline character),因此内定的 record separator 使得文字
的每一行是一个记录。

record separator 随著内建变数 RS 的改变而改变。RS 是一个字串,
它的内定值是”\n”。仅有 RS 的第一个字元是有效的,它被当作 record
separator,而 RS 的其它字元会被忽略。

内建变数 FNR 会储存目前的输入档案已经被读取的记录之个数。内
建变数 NR 会储存目前为止所有的输入档案已经被读取的记录之个数。

3.2 栏位(field)

gawk 会自动将每个记录分解成多个栏位 (field)。类似於字在一
行里面,gawk 的内定动作会认为栏位之间是以 whitespace 分开。在
gawk 里,whitespace 的意思是一个或多个空白或 tabs。

在 gawk 程式里面,以’$1’表示第一个栏位,’$2’表示第二个栏位
,依此类推。举个例子,假设输入的一行如下所示:

This seems like a pretty nice example.

第一个栏位或 $1 是’This’,第二个栏位或 $2 是 ‘seems’,依此类推。
有个地方值得特别注意,第七个栏位或 $7 是’example.’而非’example’。

不论有多少栏位,$NF 可用来表示一个记录的最後一个栏位。以
上面的例子为例,$NF 与 $7 相同,也就是’example.’。

NF 是一个内建变数,它的值表示目前这个记录之栏位的个数。

$0,看起来好像是第零个栏位,它是一个特例,它表示整个记录。

下面是一个较复杂的例子:

gawk ‘$1~/foo/ {print $0}’ BBS-list

结果如下:
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sabafoo 555-2127 1200/300 C

这个例子是把输入档’BBS-list’的每个记录的第一个栏位作检查,如
果它含有子字串’foo’,则这一个记录会被印出。

3.3 如何将记录分解成栏位

gawk 根据 field separator 将一个记录分解成栏位。field sepa-
rator 以内建变数 FS 表示。

举个例子,假如 field separator 是’oo’,则下面的行:

moo goo gai pan

会被分成三个栏位:’m’、’ g’、’ gai pan’。

在 gawk 程式里,可以使用’=’来改变 FS 的值。例如:

gawk ‘BEGIN {FS=”,”}; {print $2}’

输入行如下:

John Q. Smith, 29 Oak St., Walamazoo, MI 42139

执行gawk的结果将印出字串 ‘ 29 Oak St.’。BEGIN 後面的 action 会在
第一个记录被读取之前执行一次。

第四章 印出

在gawk程式里,actions 最常做的事就是印出(printing)。简单
的印出,使用 printe叙述。复杂格式的印出,使用 printf 叙述。

4.1 print叙述

print 叙述用在简单、标准的输出格式。叙述的格式如下所示:

print item1, item2, …

输出时,各个 item 之间会以一个空白分开,最後会换行(newline)。

如果 ‘print’叙述之後没有跟著任何东西,它与’print $0’的效
果一样,它会印出现在的记录(record)。要印出空白行可使用’print
“”‘。 印出一段固定的文字,可用双引号将文字的两边括起来,例如
‘print “Hello there”‘。

这里是一个例子,它会把每个输入记录的前二个栏位印出:

gawk ‘{print $1,$2}’ shipped

结果如下所示:
Jan 13
Feb 15
Mar 15
Apr 31
May 16
Jun 31
Jul 24
Aug 15
Sep 13
Oct 29
Nov 20
Dec 17

Jan 21
Feb 26
Mar 24
Apr 21

4.2 Output Separators

前面我们已提过如果 print 叙述包含有多个 item,item 之间
用逗点分开,则印出时各个item会被一个空白隔开。你能够使用任何
的字串作为 output field separator,可以经由内建变数 OFS 的设
定来更改 output field separator。OFS 的初始值为” “,即一格的
空白。

整个 print 叙述的输出被称为 output record。print 叙述输
出 output record 之後,会接著输出一个字串,此字串称为 output
record separator。内建变数 ORS 用来指明此字串。ORS 的初始值
为 “\n”,也就是换行。

下面这个例子会印出每个记录的第一个栏位和第二个栏位,此二
个栏位之间以分号’;’分开,每行输出之後会加入一个空白行。

gawk ‘BEGIN {OFS=”;”; ORS=”\n\n”} {print $1, $2}’ BBS-list

结果如下所示:
aardvark;555-5553

alpo-net;555-3412

barfly;555-7685

bites;555-1675

camelot;555-0542

core;555-2912

fooey;555-1234

foot;555-6699

macfoo;555-6480

sdace;555-3430

sabafoo;555-2127

4.3 printf叙述

printf 叙述会使得输出格式较容易精确地控制。printf 叙述可以
指定每个 item 印出的宽度,也可以指定数字的各种型式。

printf 叙述的格式如下:

printf format, item1, item2, …

print 与 printf 的差别是在於 format, printf 的引数比 print
多了字串 format。format 的型式与 ANSI C 的 printf 之格式相同。

printf 并不会做自动换行的动作。内建变数 OFS 与 ORS 对 printf 叙
述没有任何影响。

格式的指定以字元’%’开始,後面接著格式控制字母。

格式控制字母如下所示:

‘c’ 将数字以 ASCII 字元印出。
例如’printf “%C”,65’会印出字元’A’。

‘d’ 印出十进位的整数。

‘i’ 印出十进位的整数。

‘e’ 将数字以科学符号的形式印出。
例如

print “$4.3e”,1950

结果会印出’1.950e+03’。

‘f’ 将数字以浮点的形式印出。

‘g’ 将数字以科学符号的形式或浮点的形式印出。数字的绝对值如果
大於等於0.0001则以浮点的形式印出,否则以科学符号的形式印
出。

‘o’ 印出无号的八进位整数。

‘s’ 印出一个字串。

‘x’ 印出无号的十六进位整数。10至15以’a’至’f’表示。

‘X’ 印出无号的十六进位整数。10至15以’A’至’F”表示。

‘%’ 它并不是真正的格式控制字母,’%%”将印出”%’。

在 % 与格式控制字母之间可加入 modifier,modifier 是用来进一
步控制输出的格式。可能的 modifier 如下所示:

‘-‘ 使用在 width 之前,指明是向左靠齐。如果’-‘没有出现,则会在
被指定的宽度向右靠齐。例如:

printf “%-4S”, “foo”

会印出’foo ‘。

‘width’ 这一个数字指示相对应的栏位印出时的宽度。例如:

printf “%4s”,”foo”

会印出’ foo’。

width 的值是一个最小宽度而非最大宽度。如果一个 item 的
值需要的宽度比 width 大,则不受 width 的影响。例如

printf “%4s”,”foobar”

将印出’foobar’。

‘.prec’ 此数字指定印出时的精确度。它指定小数点右边的位数。如
果是要印出一个字串,它指定此字串最多会被印出多少个字
元。

第五章 patterns

在 gawk 程式里面,当 pattern 符合现在的输入记录(record),其
相对应的 action 才会被执行。

5.1 Pattern的种类

这里对 gawk 的各种 pattern 型式作一整理:

/regular expression/
一个 regular expression 当作一个 pattern。每当输入记录 (
record)含有 regular expression 就视为符合。

expression
一个单一的 expression。当一个值不为 0 或一个字串不是空的,
则可视为符合。

pat1,pat2
一对的 patterns 以逗号分开,指定记录的□围。

BEGIN
END
这是特别的 pattern, gawk 在开始执行或要结束时会分别执行相
对应於BEGIN或END的 action。

null
这是一个空的pattern,对於每个输入记录皆视为符合pattern。

5.2 Regular Expressions当作Patterns

一个 regular expression 可简写为 regexp,是一种描述字串的方
法。一个 regular expression 以斜线(‘/’)包围当作 gawk 的 pattern。

如果输入记录含有 regexp 就视为符合。例如:pattern 为 /foo/,
对於任何输入记录含有’foo’则视为符合。

下面的例子会将含有’foo’的输入记录之第2个栏位印出。

gawk ‘/foo/ {print $2}’ BBS-list

结果如下:
555-1234
555-6699
555-6480
555-2127

regexp 也能使用在比较的算式。

exp ~ /regexp/
如果 exp 符合 regexp,则结果为真(true)。

exp !~ /regexp/
如果 exp 不符合 regexp,则结果为真。

5.3 比较的算式当作Patterns

比较的 pattern 用来测试两个数字或字串的关系诸如大於、等於
、小於。下面列出一些比较的pattern:

x<y 如果 x 小於 y,则结果为真。
x<=y 如果 x 小於、等於 y,则结果为真。
x>y 如果 x 大於 y,则结果为真。
x>=y 如果 x 大於、等於 y,则结果为真。
x==y 如果 x 等於 y,则结果为真。
x!=y 如果 x 不等於 y,则结果为真。
x~y 如果 x 符合 regular expression y,则结果为真。
x!~y 如果 x 不符合 regular expression y,则结果为真。

上面所提到的 x 与 y,如果二者皆是数字则视为数字之间的比较,
否则它们会被转换成字串且以字串的形式做比较。两个字串的比较,
会先比较第一个字元,然後比较第二个字元,依此类推,直到有不同
的地方出现为止。如果两个字串在较短的一个结束之前是相等,则视
为长的字串比短的字串大。例如 “10” 比 “9” 小,”abc” 比 “abcd” 小。

5.4 使用布林运算的Patterns

一个布林(boolean) pattern 是使用布林运算”或”(‘||’),”及”
(‘&&’),”反”(‘!’)来组合其它的pattern。
例如:

gawk ‘/2400/ && /foo/’
BBS-list
gawk ‘/2400/ || /foo/’ BBS-list
gawk ‘! /foo/’ BBS-list

第六章 算式(Expression)作为Actions的叙述

算式(Expression) 是gawk程式里面action的基本构成者。

6.1 算术运算

gawk 里的算术运算如下所示:

x+y 加
x-y 减
-x 负
+x 正。实际上没有任何影响。
x*y 乘
x/y 除
x%y 求馀数。例如 5%3=2。
x^y
x**y x 的 y 次方。例如2^3=8。

6.2 比较算式与布林算式

比较算式 (comparison expression) 用来比较字串或数字的关系
,运算符号与 C 语言相同。表列如下:

x<y
x<=y
x>y
x>=y
x==y
x!=y
x~y
x!~y

比较的结果为真(true)则其值是 1。否则其值是 0。

布林算式(boolean expression)有下面三种:

boolean1 && boolean2
boolean1 || boolean2
! boolean

6.3 条件算式(Conditional Expressions)

一个条件式算式是一种特别的算式,它含有3个运算元。
条件式算式与C语言的相同:

selector ? if-true-exp : if-false-exp

它有3个子算式。第一个子算式selector 首先会被计算。如果是真,
则if-true-exp会被计算且它的值变成整个算式的值。否则if-false-
exp 会被计算且它的值变成整个算式的值。

例如下面的例子会产生x的绝对值:

x>0 ? x : -x

第七章 Actions里面的控制叙述

在 gawk 程式里面,控制叙述诸如 if、while 等控制程式执行的流
程。在 gawk 里的控制叙述与 C 的类似。

很多的控制叙述会包括其它的叙述,被包括的叙述称为 body。假
如 body 里面包括一个以上的叙述,必须以大括弧 { } 将这些叙述括起
来,而各个叙述之间需以换行(newline)或分号隔开。

7.1 if 叙述

if (condition) then-body [else else-body]

如果 condition 为真(true),则执行 then-body,否则执行 else-body。

举一个例子如下:

if (x % 2 == 0)
print “x is even”
else
print “x is odd”

7.2 while 叙述

while (condition)
body

while 叙述做的第一件事就是测试 condition。假如 condition 为真则
执行 body 的叙述。body 的叙述执行完後,会再测试 condition,假如
condition 为真,则 body 会再度被执行。这个过程会一直被重复直到
condition 不再是真。如果 condition 第一次测试就是伪(false),则
body 从没有被执行。

下面的例子会印出每个输入记录(record)的前三个栏位。

gawk ‘{ i=1
while (i <= 3) {
print $i
i++
}
}’

7.3 do-while 叙述

do
body
while (condition)

这个 do loop 执行 body 一次,然後只要 condition 是真则会重复执行 body。
即使开始时 condition 是伪,body 也会被执行一次。

下面的例子会印出每个输入记录十次。

gawk ‘{ i= 1
do {
print $0
i++
} while (i <= 10)
}’

7.4 for 叙述

for (initialization; condition; increment)
body

此叙述开始时会执行initialization,然後只要 condition是真,它
会重复执行body与做increment 。

下面的例子会印出每个输入记录的前三个栏位。

gawk ‘{ for (i=1; i<=3; i++)
print $i
}’

7.5 break 叙述

break 叙述会跳出包含它的 for、while、do-while 回圈的最内层。

下面的例子会找出任何整数的最小除数,它也会判断是否为质数。

gawk ‘# find smallest divisor of num
{ num=$1
for (div=2; div*div <=num; div++)
if (num % div == 0)
break
if (num % div == 0)
printf “Smallest divisor of %d is %d\n”, num, div
else
printf “%d is prime\n”, num }’

7.6 continue 叙述

continue 叙述使用於 for、while、do-while 回圈内部,它会跳
过回圈 body 的剩馀部分,使得它立刻进行下一次回圈的执行。

下面的例子会印出 0 至 20 的全部数字,但是 5 并不会被印出。

gawk ‘BEGIN {
for (x=0; x<=20; x++) {
if (x==5)
continue
printf (“%d”,x)
}
print “”
}’

7.7 next 叙述、next file 叙述、exit 叙述

next 叙述强迫 gawk 立刻停止处理目前的记录(record)而继续下一
个记录。

next file 叙述类似 next。然而,它强迫 gawk 立刻停止处理目前
的资料档。

exit 叙述会使得 gawk 程式停止执行而跳出。然而,如果 END 出现
,它会去执行 END 的 actions。

第八章 内建函式(Built-in Functions)

内建函式是 gawk 内建的函式,可在 gawk 程式的任何地方呼叫内建
函式。

8.1 数值方面的内建函式

int(x) 求出 x 的整数部份,朝向 0 的方向做舍去。例如:int(3.9)
是 3,int(-3.9) 是 -3。
sqrt(x) 求出 x 正的平方根值。例 sqrt(4)=2
exp(x) 求出 x 的次方。例 exp(2) 即是求 e*e 。
log(x) 求出 x 的自然对数。
sin(x) 求出 x 的 sine 值,x 是弪度量。
cos(x) 求出 x 的 cosine 值,x 是弪度量。
atan2(y,x) 求 y/x 的 arctangent 值,所求出的值其单位是弪度量。
rand() 得出一个乱数值。此乱数值平均分布在 0 和 1 之间。这个
值不会是 0,也不会是 1。
每次执行 gawk,rand 开始产生数字从相同点或 seed。
srand(x) 设定产生乱数的开始点或 seed 为 x。如果在第二次你设
定相同的 seed 值,你将再度得到相同序列的乱数值。
如果省略引数 x,例如 srand(),则现在的日期、时间会
被当成 seed。这个方法可使得乱数值是真正不可预测的。
srand 的传回值(return value)是前次所设定的 seed 值。

8.2 字串方面的内建函式

index(in, find)
它会在字串 in 里面,寻找字串 find 第一次出现的地方,传回值是
字串 find 出现在字串 in 里面的位置。如果在字串 in 里面找不到字
串 find,则传回值为 0。
例如:
print index(“peanut”,”an”)
会印出 3。

length(string)
求出 string 有几个字元。
例如:
length(“abcde”)
是 5。

match(string,regexp)
match 函式会在字串 string 里面,寻找符合 regexp 的最长、最靠
左边的子字串。传回值是 regexp 在 string 的开始位置,即 index
值。
match 函式会设定内在变数 RSTART 等於 index,它也会设定内在变
数 RLENGTH 等於符合的字元个数。如果不符合,则会设定 RSTART 为
0、RLENGTH 为 -1。

sprintf(format,expression1,…)
举 printf 类似,但是 sprintf 并不印出,而是传回字串。
例如:
sprintf(“pi = %.2f (approx.)’,22/7)
传回的字串为”pi = 3.14 (approx.)”

sub(regexp, replacement,target)
在字串 target 里面,寻找符合 regexp 的最长、最靠左边的地方,
以字串 replacement 代替最左边的 regexp。
例如:
str = “water, water, everywhere”
sub(/at/, “ith”,str)
结果字串str会变成
“wither, water, everywhere”

gsub(regexp, replacement, target)
gsub 与前面的 sub 类似。在字串 target 里面,寻找符合 regexp 的
所有地方,以字串 replacement 代替所有的 regexp。
例如:
str=”water, water, everywhere”
gsub(/at/, “ith”,str)
结果字串str会变成
‘wither, wither, everywhere”

substr(string, start, length)
传回字串 string 的子字串,这个子字串的长度为 length 个字元,
从第 start 个位置开始。
例如:
substr(“washington”,5,3)
传回值为”ing”
如果 length 没有出现,则传回的子字串是从第 start 个位置开始
至结束。
例如:
substr(“washington”,5)
传回值为”ington”

tolower(string)
将字串string的大写字母改为小写字母。
例如:
tolower(“MiXeD cAsE 123”)
传回值为”mixed case 123″

toupper(string)
将字串string的小写字母改为大写字母。
例如:
toupper(“MiXeD cAsE 123”)
传回值为”MIXED CASE 123″

8.3 输入输出的内建函式

close(filename)
将输入或输出的档案 filename 关闭。

system(command)
此函式允许使用者执行作业系统的指令,执行完毕後将回到 gawk
程式。
例如:
BEGIN {system(“ls”)}

第九章 使用者定义的函式(User-defined Functions)

复杂的 gawk 程式常常可以使用自己定义的函式来简化。呼叫使用
者定义的函式与呼叫内建函式的方法一样。

9.1 函式定义的格式

函式的定义可以放在 gawk 程式的任何地方。

一个使用者定义的函式其格式如下:

function name (parameter-list) {
body-of-function
}

name 是所定义的函式之名称。一个正确的函式名称可包括一序列的字
母、数字、下标线 (underscores),但是不可用数字做开头。

parameter-list 是列出函式的全部引数(argument),各个引数之
间以逗点隔开。

body-of-function 包含 gawk 的叙述 (statement)。它是函式定义
里最重要的部份,它决定函式实际要做何种事。

9.2 函式定义的例子

下面这个例子,会将每个记录的第一个栏位之值的平方与第二个
栏位之值的平方加起来。

{print “sum =”,SquareSum($1,$2)}
function SquareSum(x,y) {
sum=x*x+y*y
return sum
}

第十章 □例

这里将列出 gawk 程式的一些例子。

gawk ‘{if (NF > max) max = NF}
END {print max}’
此程式会印出所有输入行之中,栏位的最大个数。

gawk ‘length($0) > 80’
此程式会印出一行超过 80 个字元的每一行。此处只有 pattern 被
列出,action 是采用内定的 print。

gawk ‘NF > 0’
对於拥有至少一个栏位的所有行,此程式皆会印出。这是一个简
单的方法,将一个档案里的所有空白行删除。

gawk ‘{if (NF > 0) print}’
对於拥有至少一个栏位的所有行,此程式皆会印出。这是一个简
单的方法,将一个档案里的所有空白行删除。

gawk ‘BEGIN {for (i = 1; i <= 7; i++)
print int(101 * rand())}’
此程式会印出□围是 0 到 100 之间的 7 个乱数值。

ls -l files | gawk ‘{x += $4}; END {print “total bytes: ” x}’
此程式会印出所有指定的档案之bytes数目的总和。

expand file | gawk ‘{if (x < length()) x =
length()}
END {print “maximum line length is ” x}’
此程式会将指定档案里最长一行的长度印出。expand 会将 tab 改
成 space,所以是用实际的右边界来做长度的比较。

gawk ‘BEGIN {FS = “:”}
{print $1 | “sort”}’ /etc/passwd
此程式会将所有使用者的login名称,依照字母的顺序印出。

gawk ‘{nlines++}
END {print nlines}’
此程式会将一个档案的总行数印出。

gawk ‘END {print NR}’
此程式也会将一个档案的总行数印出,但是计算行数的工作由gawk
来做。

gawk ‘{print NR,$0}’
此程式印出档案的内容时,会在每行的最前面印出行号,它的功
能与 ‘cat -n’ 类似。

第十一章 结论

gawk 对於资料的处理具有很强的功能。它能够以很短的程式完成
想要做的事,甚至一或二行的程式就能完成指定的工作。同样的一件
工作,以 gawk 程式来写会比用其它程式语言来写短很多。

gawk 是 GNU 所做的 awk,它是公众软体(Public Domain) 可免费使
用。

第十二章 下载

Windows环境下可以下载UnxUtils.zip,进行使用

XP打开视频文件夹时资源管理器就自动关闭的处理办法

Windows
XP和2000中关闭视频文件预览的方法

    Windows
XP
   
在“开始→运行”中输入“regsvr32
/ushmedia.dll”回车,出现“shmedia.dll中的DllUnregisterServer成功”的对话框就说明成功禁止预览功能了。
如果想恢复它时,输入“regsvr32 shmedia.dll”即可。

Windows 2000

打开要禁止预览的文件夹,右键单击空白处,选择“自定义文件夹”,会出现自定义文件夹向导,其中有

一个“请选择模板”项,选择其中的“简易”就可以禁止预览了。