5,gawk实用程序

linux 工具―― gawk

什么是awk,什么是nawk,什么是gawk?

Awklinux/unix下的用来操纵数据和产生报告的程序语言。Nawk是新的版本,gawkgnu版本。数据可以来自标准输入,一个或者多个文件,或者其他命令的输出。Awk可用于命令行的简单操作,也可以写入大的应用程序。因为awk可以操纵书籍,所以它是shell教本和管理小型数据库中必须的工具。

Awk逐行扫描文件,从第一行到最后一行,寻找匹配特定模块的行,并在这些行上运行“选择”动作。如果一个模块没有指定动作,这些配置的行就被显示在屏幕上。如果一个动作没有模板,所有被动作指定的行被处理。

Gawkgun awk程序语言工程的成果。

本章内容基于gawk

awk的格式

一个awk程序包括awk命令,程序结构,引用(或输入文件)和输入文件的名字。如果输入文件没有被指定,输入就来自标准输入或键盘。

Awk结构由模板,动作或者模板和动作联合组成。模板是由某种类型表达式的说明组成。如果没有看见关键字if,但是你在评价表达式的时候想到了单词if,这就是模板。动作是在大括号内被分号或者新的一行封的一个和多个说明。模板不能够放在大括号中,由在斜杠中间的正则表达式和awk提供的操作中的一个或者几个组成。

Awk命令可以从命令行中输入,也可以从awk脚本中输入。输入行可以来自文件,管道和标准输入。

命令格式:从文件输入

awk ‘pattern’ filename

awk ‘{action}’ filename

awk ‘pattern {action}’ filename

命令格式:从命令输入

command | awk ‘pattern’

command | awk ‘{action}’

command | awk ‘pattern {action}’

例子:

[posftp@SZTrade posftp]$ df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/sda6 50394964 14237672 33597336 30% /

/dev/sda3 101107 16228 79658 17% /boot

none 3991708 0 3991708 0% /dev/shm

tmpfs 1048576 1024000 24576 98% /informix.links/SZTrade/tmpfs

[posftp@SZTrade posftp]$ df | awk '$4>75000'

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/sda6 50394964 14237784 33597224 30% /

/dev/sda3 101107 16228 79658 17% /boot

none 3991708 0 3991708 0% /dev/shm

[posftp@SZTrade posftp]$

df报告文件系统中的剩余空间。Df 命令输出通过管道传送给awk。如果第四个域中的块多于75000,则打印该行。

Awk命令行选项

Awk由很多的命令行选项。Gawk有两种命令行选项格式:Gun长格式以双横线开始(--,后面紧跟着一个单词;短的传统POSIX格式,由一个横线和一个字母组成。Grep使用-W选项或者相应的长格式。任何提供给长选项的参数货殖用=连接(中间没有空格),或者在下一命令行的参数内提供。

[posftp@SZTrade posftp]$ awk -help

Usage: awk [POSIX or GNU style options] -f progfile [--] file ...

Usage: awk [POSIX or GNU style options] [--] 'program' file ...

POSIX options: GNU long options:

-f progfile --file=progfile

-F fs --field-separator=fs

-v var=val --assign=var=val

-m[fr] val

-W compat --compat

-W copyleft --copyleft

-W copyright --copyright

-W dump-variables[=file] --dump-variables[=file]

-W gen-po --gen-po

-W help --help

-W lint[=fatal] --lint[=fatal]

-W lint-old --lint-old

-W non-decimal-data --non-decimal-data

-W profile[=file] --profile[=file]

-W posix --posix

-W re-interval --re-interval

-W source=program-text --source=program-text

-W traditional --traditional

-W usage --usage

-W version --version

To report bugs, see node `Bugs' in `gawk.info', which is

section `Reporting Problems and Bugs' in the printed version.

gawk is a pattern scanning and processing language.

By default it reads standard input and writes standard output.

Examples:

gawk '{ sum += $1 }; END { print sum }' file

gawk -F: '{ print $1 }' /etc/passwd

[posftp@SZTrade posftp]$

经常用的gawk命令行选项

-F fs 指定输入文件的分隔符,fs式一个字符串货殖一个正则表达式

-v var=value, 赋值一个用户定义的变量,执行在awk脚本前var,这样在BEGIN块中的变量就是合法的了。

-f scriptfile 从脚本文件中读取awk命令。

格式输出

打印函数

awk命令的动作部分式在小括号内的。如果没有指定动作并且有模板被匹配,awk就运行默认动作,将所有匹配的行打印到屏幕。Print函数用来打印简单且不需要特殊格式的输出。要打印更为复杂和精确的格式,就需要使用printfsprintf函数了。

Print函数也可以直接用在awk命令的动作部分(print.print函数的参数可以是变量,数值或者字符串。字符串必须用双引号引用,参数用逗号封。如果没有逗号,参数就串连在一起而无法区分。

[posftp@SZTrade posftp]$ date

Tue Aug 8 14:43:54 CST 2006

[posftp@SZTrade posftp]$ date | awk '{print "month: " $2 "nYear: ",$6}'

month: Aug

Year: 2006

[posftp@SZTrade posftp]$

linuxdate命令输出通过管道给awk。字符串month:被打印,后面跟着换行符“n”的秒域和Year:最后是第六域($6.

换码序列。换码序列表现为一个反斜杠后面紧跟着一个字母或者数字。他们被用在字符串中表示空格,新行及换页等等

换码序列

含义

b

Backspace

f

换页

n

新行

r

回车

t

制表符

47

十进制47,表示单引号

c

C表示其他任何字符

Awk ‘/Sally/{print “ttHave a nice day, “ $1,$2 “!!”}’ employees

如果某行包含模板Sally,print函数就打印两个制表符,字符串Have a nice day,第一个域(用$1表示)和第二个域(用$2表示)后面紧跟着一个包含灵感感叹号的字符串。

OFMT变量

在打印数字的时候你也许想控制数字的格式,我们通常用printf来完成这个功能。Awk的特殊变量OFMT也可以在使用print函数的时候,控制数字的打印格式。它的默认值是“%。6g”----小数点后面6位将被打印

[posftp@SZTrade posftp]$ awk 'BEGIN{OFMT="%.2f"; print 1.2456789,12E-2}'

1.25 0.12

[posftp@SZTrade posftp]$

OFMT变量被设置为浮点数(f)的小数点后面两位被打印。百分号(%)用来说明指定的格式。

Printf函数

Printf函数返回一个打印到屏幕的格式化好的字符串,就像c语言中关于printf的说明。Printf函数由被引用的控制字符串组成,这个控制字符串可以嵌入指定格式和改变量。控制字符串紧跟着一个逗号和一串由逗号分割的表达式,这些表达式将按照控制字符串指定的形式被格式化。跟print函数不同,printf函数不提供换行符,如果需要换行就必须写换码序列,n.

转换字符

转换字符

定义

c

字符

s

字符串

d

十进制数

ld

长十进制数

u

无正负的十进制数

lu

长的无正负之分的十进制数

x

十六进制数

lx

长十六进制数

o

八进制数

lo

长八进制数

e

用科学计数法记录的浮点数

f

浮点数

g

使用e 或者 f函数处理过的浮点数,占用最少的空间

Printf修正符

字符

定义

-

左对齐

#

显示八进制数的时候以0开头;显示十六进制数的时候以0x开头

+

使用d,e,f或者g转换一行,数字前面保持+或者-

0

0代替空格填补空白

格式化说明符

Printf格式化说明符

功能

(假设 x=A y=15 z=23. $1=Bob Smith

%c

打印单个ASCII字符

printf(“The character is %cn”,x)结果为:The character is A

%d

打印十进制数

printf(“The boy is $d year oldn”,y)结果为:The boy is 15 year old

%e

打印用科学计数法表示的数

printf(“z is %en”,z)结果为:z is 2.3e+01

%f

打浮点数

printf(“z is %fn”,2.3*2)结果为:z is 4.600000

%o

打印八进制数

printf(“y is %on”,y)结果为:y is 17

%s

打印字符串

printf(“The name of the culprit is %sn”,$1)结果为:The name of the culprit is Bob Smith

%x

打印十六进制数

printf(“y is %xn”,y)结果为:y is f

5.5记录和域

5.5.1记录

awk并不是把输入文件当作一个没有终止的字符串,而是看作具有一定格式和结构的。默认每一个以换行符结束的行称做一个记录。

记录分割符。默认输入和输出的分隔符都是回车,保存在awk内建变量ORSRS中,ORSRS的值可以在有限的范围内修改。

$0变量。在awk$0指的是整条记录(当发生替换或者赋值而使得$0的值发生改变时,NF的值和域的个数都会跟着发生变化)。换行符的值保存在awk内建变量RS中,默认情况下回车。

变量NR。多个记录的每一条都保存在内建变量NR中。每处理完一个记录,NR的值就增加1

5.5.2

记录中的每一个单词称为“域”,默认情况下以空格或者tab分割。每一个单词叫做一个域,awk跟踪域的数量,并在内建变量NF中保存这个数字。每一行的域的个数是不一样的。典型限制为每行100个。

5.5.3 域分割符

输入域分割符。Awk的内建变量FS保存输入域分割符的值。默认值是空格或者tab.可以在BEGIN语句中或者命令行上修改FS的值。

在命令行上修改域分割符。awk命令后面加上-F选项可以用来修改输入文件的域分割符。在-F后面的字符串立刻就变成新的域分割符。包含元字符串可以重新设置多个域分隔符。

使用多个域分割符。可以指定多个输入分隔符,若域分隔符由多个字符组成,如FS,则该字符串是一个放在方括号内的正则表达式。

例子:awk –F ‘ [ :t]’ ‘{print $1,$2,$3}’ employees2

输出域分割符。默认的输出分隔符是一个空格,保存在awk内建变量OFS中。

5.6 模式与动作

5.6.1 模式

awk模式控制awk对输入的文件行所做的动作,一个模式包含正则表达式,条件表达式,或者二者的结合。当条件表达式为真的时候,默认动作是打印该行。当读取一个模式表达式时,可以使用if语句。使用if时不需要花括号引用。这里的if变成一个动作语句,语法结果发生了变化。

5.6.2 动作

花括号内的,用分号分割的语句称为动作。如果模式在动作前面,模式决定什么时候发出动作。动作可以是一个语句也可以是一组语句。语句之间用分号分割,也可以用换行符。

5.7 正则表达式

对于awk来说,正则表达式就是由斜杠之间的字符组成的模式。Awk支持用正则表达式元字符修改正则表达式。如果输入行的字符串匹配正则表达式,结果条件为真,则执行所有与模式捆绑在一起的动作,如果正则表达式被匹配但是没有指定任何动作,则只打印该记录。

5.8 脚本文件中的awk命令

当你有多个awk的模式/动作语句的时候,最简单的办法就是把它们放在一个脚本文件中。脚本文件是一个包含awk注释和语句的文件。如果语句和动作在同一行,则必须分号分割。若在不同的行则无需使用分号了。如果模式后面是动作,左花括号就必须与模式在同一行。注释由#引导。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/312079/viewspace-245426/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/312079/viewspace-245426/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值