li
  当前位置:主页 > 操作系统 > 文章内容
li
shell最适用东西:awk实用手册
来源: www.ixdba.net  作者: IXDBA.NET官方    时间:2007-12-19   阅读:45  
本文章共11437字,分3页,当前第1页,快速翻页:
 

a w k是一种程序语言,对文档资料的处理具有很强的功能。awk 名称是由它三个最初设计者的姓氏的第一个字母而命名的: Alfred V. AhoPeter J. We i n b e rg e rBrian W. Kernighan a w k最初在1 9 7 7年完成。
1 9 8 5
年发表了一个新版本的a w k,它的功能比旧版本增强了不少。a w k 能够用很短的程序对文档里的资料做修改、比较、提取、打印等处理。如果使用C P a s c a l 等语言编写程序完成上述的任务会十分不方便而且很花费时间,所写的程序也会很大。
IXDBA.NET技术社区
a w k
不仅仅是一个编程语言,它还是L i n u x系统管理员和程序员的一个不可缺少的工具。 a w k语言本身十分好学,易于掌握,并且特别的灵活。

 6.1 gawk的主要功能


gawk


6.7
字符串和数字



6.8



6.9



6.10


g a w k


6.11



6.12 BEGIN



6.13


6.14 内置变量


g a w k
语言中有几个十分有用的内置变量,现在列于下面:
NR
已经读取过的记录数。
FNR
从当前文件中读出的记录数。
F I L E N A M E
输入文件的名字。
FS
字段分隔符(缺省为空格)。
RS
记录分隔符(缺省为换行)。
OFMT
数字的输出格式(缺省为% g)。
OFS
输出字段分隔符。
ORS
输出记录分隔符。
NF
当前记录中的字段数。
如果你只处理一个文件,则NR FNR 的值是一样的。但如果是多个文件, N R是对所有
的文件来说的,而FNR 则只是针对当前文件而言。
例如:
NR
检查记录数是否小于5,如果小于5,则显示出错信息。
F S
十分有用,因为F S控制输入文件的字段分隔符。例如,在B E G I N格式中,使用如下的
命令:
F S = " : "


6.15


6.15.1 if


6.16
数组


g a w k


6.17



6.18



6.18


最后,再举几个g a w k的例子:
gawk '{if (NF > max) max = NF}
END {print max}'
此程序会显示所有输入行之中字段的最大个数。
gawk 'length($0) > 80'
此程序会显示出超过80 个字符的每一行。此处只有模式被列出,动作是采用缺省值显示
整个记录。
gawk 'NF > 0'
显示拥有至少一个字段的所有行。这是一个简单的方法,将一个文件里的所有空白行删除。
gawk 'BEGIN {for (i = 1; i print int(101 * rand())}'
此程序会显示出范围是0 100 之间的7 个随机数。
ls -l files | gawk '{x += $4}; END {print "total bytes: " x}'
此程序会显示出所有指定的文件的总字节数。
expand file | gawk '{if (x END {print "maximum line length is " x}'
此程序会将指定文件里最长一行的长度显示出来。expand 会将tab 改成s p a c e,所以是用
实际的右边界来做长度的比较。
gawk 'BEGIN {FS = ":"}
{print "sum ="
S q u a r e S u m ( $ 1$ 2 ) }
function SquareSum(x
y) {
s u m = x * x + y * y
return sum
}



6.18


最后,再举几个g a w k的例子:
gawk '{if (NF > max) max = NF}
END {print max}'
此程序会显示所有输入行之中字段的最大个数。
gawk 'length($0) > 80'
此程序会显示出超过80 个字符的每一行。此处只有模式被列出,动作是采用缺省值显示
整个记录。
gawk 'NF > 0'
显示拥有至少一个字段的所有行。这是一个简单的方法,将一个文件里的所有空白行删除。
gawk 'BEGIN {for (i = 1; i print int(101 * rand())}'
此程序会显示出范围是0 100 之间的7 个随机数。
ls -l files | gawk '{x += $4}; END {print "total bytes: " x}'
此程序会显示出所有指定的文件的总字节数。
expand file | gawk '{if (x END {print "maximum line length is " x}'
此程序会将指定文件里最长一行的长度显示出来。expand 会将tab 改成s p a c e,所以是用
实际的右边界来做长度的比较。
gawk 'BEGIN {FS = ":"}
{print $1 | "sort"}' /etc/passwd
此程序会将所有用户的登录名称,依照字母的顺序显示出来。
gawk '{nlines++}
END {print nlines}'
此程序会将一个文件的总行数显示出来。
gawk 'END {print NR}'
此程序也会将一个文件的总行数显示出来,但是计算行数的工作由g a w k来做。
gawk '{print NR
$ 0 } '
此程序显示出文件的内容时,会在每行的最前面显示出行号,它的函数与‘ cat -n’类似。

 

几个实例
到此,我们已经知道了g a w k的基本用法。g a w k语言十分易学好用,例如,你可以用g a w k
编写一段小程序来计算一个目录中所有文件的个数和容量。如果用其他的语言,如C语言,则
会十分的麻烦,相反,g a w k只需要几行就可以完成此工作。
几个实例
最后,再举几个g a w k的例子:
gawk '{if (NF > max) max = NF}
END {print max}'
此程序会显示所有输入行之中字段的最大个数。
gawk 'length($0) > 80'
此程序会显示出超过80 个字符的每一行。此处只有模式被列出,动作是采用缺省值显示
整个记录。
gawk 'NF > 0'
显示拥有至少一个字段的所有行。这是一个简单的方法,将一个文件里的所有空白行删除。
gawk 'BEGIN {for (i = 1; i print int(101 * rand())}'
此程序会显示出范围是0 100 之间的7 个随机数。
ls -l files | gawk '{x += $4}; END {print "total bytes: " x}'
此程序会显示出所有指定的文件的总字节数。
expand file | gawk '{if (x END {print "maximum line length is " x}'
此程序会将指定文件里最长一行的长度显示出来。expand 会将tab 改成s p a c e,所以是用
实际的右边界来做长度的比较。
gawk 'BEGIN {FS = ":"}
{print $1 | "sort"}' /etc/passwd
此程序会将所有用户的登录名称,依照字母的顺序显示出来。
gawk '{nlines++}
END {print nlines}'
此程序会将一个文件的总行数显示出来。
gawk 'END {print NR}'
此程序也会将一个文件的总行数显示出来,但是计算行数的工作由g a w k来做。
gawk '{print NR
$ 0 } '
此程序显示出文件的内容时,会在每行的最前面显示出行号,它的函数与‘ cat -n’类似。
function name (parameter-list) {
b o d y - o f - f u n c t i o n
}
name
是所定义的函数的名称。一个正确的函数名称可包括一序列的字母、数字、下标线
( u n d e r s c o r e s )
,但是不可用数字做开头。p a r a m e t e r-list 是函数的全部参数的列表,各个参数之
间以逗点隔开。body-of-function 包含gawk 的表达式,它是函数定义里最重要的部分,它决定
函数实际要做的事情。
下面这个例子,会将每个记录的第一个字段的值的平方与第二个字段的值的平方加起来。
{print "sum ="
S q u a r e S u m ( $ 1$ 2 ) }
function SquareSum(x
y) {
s u m = x * x + y * y
return sum
}
到此,我们已经知道了g a w k的基本用法。g a w k语言十分易学好用,例如,你可以用g a w k
编写一段小程序来计算一个目录中所有文件的个数和容量。如果用其他的语言,如C语言,则
会十分的麻烦,相反,g a w k只需要几行就可以完成此工作。
几个实例
复杂的gawk 程序常常可以使用自己定义的函数来简化。调用用户自定义函数与调用内部
函数的方法一样。函数的定义可以放在gawk 程序的任何地方。
用户自定义函数的格式如下:
function name (parameter-list) {
b o d y - o f - f u n c t i o n
}
name
是所定义的函数的名称。一个正确的函数名称可包括一序列的字母、数字、下标线
( u n d e r s c o r e s )
,但是不可用数字做开头。p a r a m e t e r-list 是函数的全部参数的列表,各个参数之
间以逗点隔开。body-of-function 包含gawk 的表达式,它是函数定义里最重要的部分,它决定
函数实际要做的事情。
下面这个例子,会将每个记录的第一个字段的值的平方与第二个字段的值的平方加起来。
{print "sum ="
S q u a r e S u m ( $ 1$ 2 ) }
function SquareSum(x
y) {
s u m = x * x + y * y
return sum
}
到此,我们已经知道了g a w k的基本用法。g a w k语言十分易学好用,例如,你可以用g a w k
编写一段小程序来计算一个目录中所有文件的个数和容量。如果用其他的语言,如C语言,则
会十分的麻烦,相反,g a w k只需要几行就可以完成此工作。
用户自定义函数
语言支持数组结构。数组不必事先初始化。声明一个数组的方法如下:
a r r a y n a m e [ n u m ] = v a l u e
请看下面的例子:
# reverse lines in a file
{line[NR] = $0 } # remember each line
END {var=NR # output lines in reverse order
while (var > 0){
print line[var]
v a r - -
}
}
此段程序读取一个文件的每一行,并用相反的顺序显示出来。我们使用N R作为数组的下
标来存储文件的每一条记录,然后在从最后一条记录开始,将文件逐条地显示出来。
表达式
if
表达式的语法如下:
if (expression){
c o m m a n d s
}
e l s e {
c o m m a n d s
}
例如:
# a simple if loop
(if ($1 == 0){
print "This cell has a value of zero"
}
else {
printf "The value is %dn"
$ 1
} )
再看下一个例子:
# a nicely formatted if loop
(if ($1 > $2){
print "The first column is larger"
}
else {
print "The second column is larger"
} )
6.15.2 while
循环
while
循环的语法如下:
while (expression){
c o m m a n d s
}
例如:
# interest calculation computes compound interest
# inputs from a file are the amount
interest_rateand years
{var = 1
while (var p r i n t f ( " % f n "
$ 1 * ( 1 + $ 2 ) ^ v a r )
v a r + +}
}
6.15.3 for
循环
for
循环的语法如下:
for (initialization; expression; increment) {
c o m m a n d
}
例如:
# interest calculation computes compound interest
# inputs from a file are the amount
interest_rateand years
{for (var=1; var p r i n t f ( " % f n "
$ 1 * ( 1 + $ 2 ) ^ v a r )
}
}
6.15.4 next
exit
next
指令用来告诉gawk 处理文件中的下一个记录, 而不管现在正在做什么。语法如下:
{ command1
c o m m a n d 2
c o m m a n d 3
n e x t
c o m m a n d 4
}
程序只要执行到n e x t指令,就跳到下一个记录从头执行命令。因此,本例中, c o m m a n d 4
指令永远不会被执行。
程序遇到e x i t指令后,就转到程序的末尾去执行E N D,如果有E N D的话。
控制结构
g a w k中,可以用等号( = )给一个变量赋值:
var1 = 10
g a w k中,你不必事先声明变量类型。
请看下面的例子:
$1 == "Plastic" { count = count + 1 }
如果第一个字段是P l a s t i c,则c o u n t的值加1。在此之前,我们应当给c o u n t赋予过初值,一
般是在B E G I N部分。
下面是比较完整的例子:
BEGIN { count = 0 }
$5 == "UNIX" { count = count + 1 }
END { printf "%d occurrences of UNIX were found"
count }
变量可以和字段和数值一起使用,所以,下面的表达式均为合法:
count = count + $6
count = $5 - 8
count = $5 + var1
变量也可以是格式的一部分,例如:
$2 > max_value {print "Max value exceeded by "
$2 - max_value}
$4 - var1
变量
有两个特殊的模式在g a w k中非常有用。B E G I N模式用来指明g a w k开始处理一个文件之前执行一些动作。B E G I N经常用来初始化数值,设置参数等。E N D模式用来在文件处理完成后
执行一些指令,一般用作总结或注释。
BEGIN
E N D中所有要执行的指令都应该用花括号括起来。BEGIN E N D必须使用大写。
请看下面的例子:
BEGIN { print "Starting the process the file" }
$1 == "UNIX" {print}
$2 > 10 {printf "This line has a value of %d"
$ 2 }
END { print "Finished processing the file. Bye!"}
此程序中,先显示一条信息: Starting the process the file,然后将所有第一个字段等于
U N I X
的整条记录显示出来,然后再显示第二个字段大于10 的记录,最后显示信息: F i n i s h e d
processing the file. Bye!
END
当需要很多对模式和动作时,你可以编写一个g a w k程序(也叫做g a w k脚本)。在g a w k程序
中,你可以省略模式和动作两边的引号,因为在g a w k程序中,模式和动作从哪开始和从哪结
束时是很显然的。


阅读更多内容1 · 2 · 3 · 下一页>>


  上一篇: 知识总结:Sed简明速查手册   下一篇: shell基础系列:awk 用法
li
 §相关评论  
 热点文章

·新手强烈推荐:linux入门11点建
·Unix学习方法-走向高手之路
·Linux性能分析和调整的基本原则
·你很陌生但是很适用的10个linu
·Oracle补丁3028673,解决单进程
·最近被aix 5305给折腾死了
·在AIX 5L上配置NFS Server/Cli
·在AIX 5L上配置与管理路由
·这个补丁影响的范围还是比较大
·在AIX 5L上使用绑定网卡(ethe
·使用pam_abl防止SSH遭暴力破解
li
 编辑推荐
·新手强烈推荐:linux入门11点建
·Unix学习方法-走向高手之路
·Linux性能分析和调整的基本原则
·你很陌生但是很适用的10个linu
·Oracle补丁3028673,解决单进程
·最近被aix 5305给折腾死了
·在AIX 5L上配置NFS Server/Cli
·在AIX 5L上配置与管理路由
·这个补丁影响的范围还是比较大
·在AIX 5L上使用绑定网卡(ethe
·使用pam_abl防止SSH遭暴力破解
li
 相关篇章
·知识总结:Sed简明速查手册
·诚邀您参加Linux爱好者技术聚会
·Solaris 10 配置双网卡双网关出口
·Solaris 10 IPMP配置
·Solaris打补丁详述
·linux内存机制研究
·添加交换空间
·Linux下的LVM创建
·Vmstat与iostat详解
·不同平台上的内存查看命令
·shell基础系列:awk 用法
·shell扫盲篇:Shell常见知识
·强烈推荐:rhcs 4.2+gfs6.1.2安...
·经验总结:Solaris性能优化
·unix shell教程:Unix系列shell程...
·unix shell系列:Unix系列shell程...
·Unix shell教程:Unix系列shell程...
·linux rpm问题:怎样查看rpm安装...
·AIX5.1L下安装bash
·linux问题小结:关于root不能登录...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接