霸绝仙途txt八零电子书:gawk实用程序

来源:百度文库 编辑:九乡新闻网 时间:2024/05/06 13:02:23
linux 工具――gawk
什么是awk,什么是nawk,什么是gawk?
Awk是linux/unix下的用来操纵数据和产生报告的程序语言。Nawk是新的版本,gawk是gnu版本。数据可以来自标准输入,一个或者多个文件,或者其他命令的输出。Awk可用于命令行的简单操作,也可以写入大的应用程序。因为awk可以操纵书籍,所以它是shell教本和管理小型数据库中必须的工具。
Awk逐行扫描文件,从第一行到最后一行,寻找匹配特定模块的行,并在这些行上运行“选择”动作。如果一个模块没有指定动作,这些配置的行就被显示在屏幕上。如果一个动作没有模板,所有被动作指定的行被处理。
Gawk是gun 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函数用来打印简单且不需要特殊格式的输出。要打印更为复杂和精确的格式,就需要使用printf和sprintf函数了。
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]$
linux的date命令输出通过管道给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内建变量ORS和RS中,ORS和RS的值可以在有限的范围内修改。
 
$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注释和语句的文件。如果语句和动作在同一行,则必须分号分割。若在不同的行则无需使用分号了。如果模式后面是动作,左花括号就必须与模式在同一行。注释由#引导。