首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | linux相关 | linux认证 | 下载中心 | 专题
oklinux
 系统管理:中文环境 系统管理 桌面应用 内核技术 Linux基础:安装配置 常用命令 经验技巧 软件应用 Linux数据库:Mysql POSTGRE
 网络管理:网络安全 网络应用 Linux服务器 编程开发:PHP CC++ Python Perl SHELL 嵌入式开发 | PHP基础 PHP技巧 PHP应用 PHP文摘
 首页 linux资讯动态 Linux专题 | 其他Unix Linux解决方案 硬件相关 Linux认证 企业应用 Apache | 相关下载:资料 参考手册 服务器
 → 当前位置:首页>编程开发>shell>正文

Gawk手册

OKLinux www.oklinux.cn 2006-06-29 来源:oklinux收集整理 会员收藏 游客收藏

出处:
http://giny.4y.com.cn/techdoc/gawk/gawk.htm
===============================================

标 题: ◇ gawk 手册

主 题: gawk.doc

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="nn"} {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 字元印出�
上一篇:${ }的用法[转]   下一篇:HDISK中丢失VGDA的恢复办法

收藏于收藏夹】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
·HDISK中丢失VGDA的恢复办法
·${ }的用法[转]
·Shell 编程入门:Linux 解释器原理
·I/O重定向 详解及例子(转贴)
·Bash命令行处理[详解]
·深入浅出Shell编程: Shell 变量
·Bourne Shell及shell编程
·Linux的Shell编程
·shell编程-shell编程-分支语句
·Linux Shell
发表评论
密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。)
站内搜索
阅读排行榜
·常用Linux Shell技巧集锦
·shell编程实例三:一个简
·Shell编程基础
·Shell 编程实例集锦
·Process priority and con
·Bash 实例:探讨 ebuild
·Linux快速编辑Shell命令行
·Linux下的shell编程入门
·Shell脚本调试技术
·linux shell 编程基础
最新文章
·Linux Shell脚本Ldd命令原
·Shell脚本显示当前网络连
·Shell脚本 实现vi/cp/mv前
·Linux解释器原理详细介绍
·Shell脚本调试技术
·Linux中使用Shell脚本去掉
·Linux操作系统下使用yum升
·UNIX和Linux Shell正则表
·重新定义Expect在Cron中的
·Shell Script(bash)--教学
·如何提高Import命令的性能
·Shell 计算明天和昨天日期
·Linux 下对于passwd 命令
·VI高级命令集锦
·Linux命令Man解释:chsh :

设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2007 All rights reserved OKLinux.Cn 版权所有