Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19730591
  • 博文数量: 679
  • 博客积分: 10495
  • 博客等级: 上将
  • 技术积分: 9308
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-18 10:51
文章分类

全部博文(679)

文章存档

2012年(5)

2011年(38)

2010年(86)

2009年(145)

2008年(170)

2007年(165)

2006年(89)

分类:

2006-12-11 17:15:03

高质量awk编程第3版 $1 开始使用AWK

In this chapter:
• How to Run awk Programs
• Datafiles for the Examples
• Some Simple Examples
• An Example with Two Rules
• A More Complex Example
• awk Statements Versus Lines
• Other Features of awk
• When to Use awk

AWK的基本功能:在文件中查找符合制定模式的行( 当然也可以是其他单位), 执行一定的操作.
AWK是数据驱动的语言,

1,怎样运行AWK程序?

第一种是命令行方式:
本例中./segUtil -l |grep "H.264-TS" 产生源数据
./segUtil -l |grep "H.264-TS"|awk '{ if ($4>240000000 && $5>30000000 && $5<50000000 && $10==0 && $9!=0 && $12>3 && $11~$12  ) print $2}'>/root/seg

可以不用任何输入源 ,直接将屏幕输入作为输入,使用Ctrl-d 表示结束, awk ’program’
下例简单的拷贝屏幕输出:
[root@Meil89 bin]# awk '{ print }'
hello
hello
good
good
[root@Meil89 bin]#

[root@Meil89 bin]# awk "BEGIN { print \"Don't Panic!\" }"
Don't Panic!

一般的来讲, awk 后面应该是用单引号对,但是这里,因为我们需要使用shell特殊字符,所以使用双引号.

第二种方法是将所有awk 命令插入一个文件,并使awk 程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。

[root@Meil89 root]# cat advice  
#! /bin/awk -f
BEGIN { print "Don't Panic!" }
[root@Meil89 root]# ./advice  
Don't Panic!
[root@Meil89 root]#



第三种方式是将所有的awk命令插入一个单独文件,然后调用:
awk -f source-file input-file1 input-file2 ...
编辑advice 文件:
[root@Meil89 root]# cat advice
BEGIN { print "Don't Panic!" }
上面的例子
[root@Meil89 root]# awk "BEGIN { print \"Don't Panic!\" }"
Don't Panic!
此次的执行:
[root@Meil89 root]# awk -f advice
Don't Panic!

为什么不给文件名"advice "加单引号, 因为文件名中一般不包含shell特殊字符.
在文件中, 可以不用使用引号来括awk语句.

关于注释:
#! /bin/awk -f, #!表示将采用什么命令和参数来执行这个文件

2,数据文件举例:
BBS-list
电脑名,电话号码,波特率, A 24 小时开放,B 晚上和周末开放, C 周末开放.

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


inventory-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

3,一些简单的例子:
在BBS-list中查找用户名包含foo的,打印出所有列

[root@Meil89 awk]# awk '/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
$0  表示所有列,实际上,默认的情况就是打印出所有列,如下:
[root@Meil89 awk]# awk '/foo/ { print  }' 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
[root@Meil89 awk]#

/foo/ 表示模式匹配

以下省略了操作部分,结果也一样:
[root@Meil89 awk]# awk '/foo/ ' 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

模式和动作部分不能全部省略:
以下省略了模式部分,结果是打印出所有行:
[root@Meil89 awk]# awk ' { print  }' 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

打印出最长行的列值:
[root@Meil89 awk]# awk '{ if (length($0) > max) max = length($0) }
END { print max }' BBS-list
33

[root@Meil89 awk]# awk '{ if (x < length()) x = length() }
END { print "maximum line length is " x }' BBS-list
maximum line length is 33

第2个length里面没有输入参数,以下将tab转换成空格之后再awk

[root@Meil89 awk]# expand BBS-list | awk '{ if (x < length()) x = length() }
> END { print "maximum line length is " x }'
maximum line length is 33
[root@Meil89 awk]#

打印出列值大于30的行
[root@Meil89 awk]# awk 'length($0) > 30' BBS-list
alpo-net 555-3412 2400/1200/300 A
[root@Meil89 awk]#

下例位打印出非空行
[root@Meil89 awk]# awk 'NF > 0' 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

打印出7个0-4的随机数:
[root@Meil89 awk]# awk 'BEGIN { for (i = 1; i <= 7; i++)
print int(5 * rand()) }'  
1
1
4
0
2
0
4
统计文件大小:
[root@Meil89 awk]# ls -l | awk '{ x += $5 } ; END { print "total bytes: " x }'     
total bytes: 893
[root@Meil89 awk]# ls -l | awk '{ x += $5 } ; END { print "total bytes: " x }'
[root@Meil89 awk]# ll
total 12
-rw-r--r--    1 root     root          311 Dec 11 17:07 BBS-list
-rw-r--r--    1 root     root          310 Dec 11 17:06 BBS-list~
-rw-r--r--    1 root     root          272 Dec 11 17:08 inventory-shipped

后面是关于换行在不同环境的使用,暂略.







阅读(4544) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~