Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10725257
  • 博文数量: 2905
  • 博客积分: 20098
  • 博客等级: 上将
  • 技术积分: 36298
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-23 05:00
文章存档

2012年(1)

2011年(3)

2009年(2901)

分类: LINUX

2009-05-23 01:35:20

  最近系统学习了一下linuxshell编程,关于bash脚本的内容太多,以后再慢慢整理。先将gawk的学习做一下笔记,方便以后查阅。本文中的原理及例子均出自Mark G.Sobell所著《Linux命令、编辑器与Shell编程》(杨明军、王凤芹译)

gawkGNU awk)工具是一种模式扫描和处理语言,它搜索一个或多个文件,以查看这些文件中是否存在匹配指定模式的记录(通常是文本)。每次发现时,它通过执行动作的方式处理文本。使用gawk可以生成报告或者过滤文本,gawk的很多结构来自C语言。

Gawk工具是UNIX awkGNU版。为了方便起见,很多linux系统将/bin/awk链接到/bin/gawk,这样用户可以使用两者中的任何一个来运行程序。

gawk语法:

agawk [模式] [{动作}] 文件                #模式和动作直接在命令行给出

bgawk –f gawk程序 文件                           #模式和动作放在gawk程序中调用

注:gawk基本用法是找到文件中与模式相匹配的行,对其采取相应的动作a为简单用法,b用于处理复杂一些的gawk功能。

模式和动作均为可选项。

若不指定模式,文件中的每一行都将被匹配;若不指定动作,gawk将对所有匹配行进行默认print操作,即输出到标准输出(屏幕)。后面的例子均以文件cars做为参数,文件中所有空白字符都由单个TAB组成(不包含任何空格)

$ cat cars

plym	   fury	     1970	73	2500  chevy	   malibu    1999	60	3000  ford	   mustang   1965	45	10000  volvo	   s80	     1998	102	9850  ford	   thundbd   2003	15	10500  chevy	   malibu    2000	50	3500  bmw	   325i	     1985	115	450  honda	   accord    2001	30	6000  ford	   taurus    2004	10	17000  toyota   rav4	     2002	180	750  chevy	   impala    1985	85	1550  ford	   explor    2003	25	9500

缺省模式:一个最简单的gawk命令如下:

$ gawk {print}cars

plym   fury         1970          73     2500
chevy  malibu       1999          60     3000
ford   mustang      1965          45     10000
volvo  s80          1998          102   9850

…….

上面的命令不指定模式,它匹配所有行并将他们输出到屏幕。

$ gawk /chevy/cars

chevy  malibu       1999          60     3000
chevy  malibu       2000          50     3500
chevy  impala       1985          85     1550
上面的命令将匹配chevy的所有行缺省print到屏幕。

$ gawk /chevy/ {print $3, $1} cars

1999    chevy
2000    chevy
1985    chevy
上面的程序先匹配chevy,再对匹配的行执行动作:输出第三字段($3)和第一字段($1),$3$1之间是空格。
  
   模式:可以使用关系操作符(>=<及其组合)执行数值比较和字符串比较,也可以用斜杠把正则表达式包装起来(如上例中/chevy/),他们都是模式。可以使用布尔操作符||(OR)或者&&(AND)来组合任何模式。
   动作:gawk中的动作最常用的就是printprintfprint是默认的动作。动作必须位于{}内,以区分模式和动作,动作的结果可以通过重定向或管道进行传递。
   变量:常用的,$0表示整行记录,$n表示当前行中的第n个字段。
   printf用法:
   printf “输出方式”, 参数1 参数2, ……, 参数n    #参数1~n常为$1~$n,顺序可自定义
输出方式中使用\n表示换行符,\t表示TAB,输出方式包含了转换规格,转换规格语法为:
   %[-][x[.y]]conv
其中-使得printf将参数左对齐,x表示最小字段宽度,.y表示小数点后面的位数,conv指示数值转换的类型:
                   Conv                     转换类型
                   s                        字符串
                   d                        十进制
                   f                        符点数
$ cat showf
{printf  %-10s %-8s  %2d  %5d $  %8.2f\n, $1, $2, $3, $4, $5}
$ gawk –f  showf cars
plym	     fury	1970	73	$  2500chevy	     malibu	1999	60	$  3000ford	     mustang	1965	45	$  10000volvo	     s80	1998	102	$  9850ford	     thundbd	2003	15	$  10500chevy	     malibu	2000	50	$  3500bmw	     325i	1985    115	$  450honda	     accord	2001	30	$  6000ford	     taurus	2004	10	$  17000toyota	     rav4	2002	180	$  750chevy	     impala	1985	85	$  1550ford	     explor	2003	25	$  9500
printf对与以整齐的格式处理报告很有用。
   ifwhilefor等控制流结构均可以用于gawk中,读者可以自行验证,这里不再举例(前面的例子作者均实际验证通过)。gawk还可以使用协进程进行网络数据交换等更高级的功能,本文不涉及这部分内容。
   本人也经常在各linux论坛搜索学习资料,感觉网上的资料很多同时也比较杂,不够系统。系统学习linux管理及编程的书籍还是需要的,再此推荐一下我正在读的Linux命令、编辑器与Shell编程》

http://licong.blog.51cto.com/542131/151976

阅读(1342) | 评论(0) | 转发(0) |
0

上一篇: Linux 中用(pkill)踢用户

下一篇:网络服务搭建、配置与管理大全(Linux版)

给主人留下些什么吧!~~