linux shell 脚本攻略学习20–awk命令入门详解 – Hi_Amos

awk生于1977年,创始人有三个,分别为 Alfred AhoPeter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母。

作用:处理文本文件。

awk的特色是可以对行和列进行操作,输入man awk可以查看awk手册,下面将主要以例子来学习awk语言。

语法:

mawk [-W option] [-F value] [-v var=value] [–] program text [file …]
mawk [
-W option] [-F value] [-v var=value] [-f program-file] [–] [file …]

参数-实例:

1、初识awk

截取top命令部分内容,拷贝到test.txt里:

[email protected]:~/learn/awk$ cat test.txt
1067 root 20 0 200m 49m 11m S 2 1.3 4:43.91 Xorg
3009 amosli 20 0 534m 21m 12m S 1 0.5 0:14.75 gnome-terminal
1002 mongodb 20 0 623m 15m 4728 S 1 0.4 0:41.17 mongod
2412 amosli 20 0 1005m 125m 17m S 1 3.2 0:48.61 chrome
3775 root 20 0 0 0 0 S 1 0.0 0:00.98 kworker/0:0
3829 amosli 20 0 17344 1356 952 R 1 0.0 0:00.11 top
2102 amosli 20 0 686m 8280 3508 S 0 0.2 0:10.11 hud-service
2176 amosli 20 0 419m 10m 8448 S 0 0.3 0:00.11 telepathy-indic
3621 root 20 0 0 0 0 S 0 0.0 0:03.30 kworker/1:2
1 root 20 0 24580 2524 1336 S 0 0.1 0:00.70 init
2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0 0.0 0:00.92 ksoftirqd/0
6 root RT 0 0 0 0 S 0 0.0 0:01.13 migration/0
7 root RT 0 0 0 0 S 0 0.0 0:00.14 watchdog/0
8 root RT 0 0 0 0 S 0 0.0 0:02.16 migration/0

下面打印第2列的内容,注意pattern里是单引号.

[email protected]:~/learn/awk$ awk {print $2} test.txt
root
amosli
mongodb
amosli
root
amosli
amosli
amosli
root
root
root
root
root
root
root

$0表示打印出来全部,$n,n>0时表示打印第n列。

2、拆解awk语句块

先看例子:

[email protected]:~/learn/awk$ awk BEGIN { i=0 } {i++} END { print i } test.txt
15

ok,是不是用点不太懂?看不太懂没关系,下面拆解开来,一个awk脚本通常分为3部分:BEGIN 语句块END语句块和能够使用模式匹配的通用语句块。这三个部分是可选的,它们中的任何一个部分都可以不出现在脚本中。脚本通常包含在单引号或者双引号里。其通用模式结构如下所示:

awk BEGIN { print “start” } pattern { commands } END { print “end” } file

下面是实际常用的语法格式:

awk BEGIN { statements } { statements } END { end statements } filename

awk的工作原理:

(1)、执行BEGIN { commands }语句块中的语句。

(2)、从文件或stdin中读取一行,然后执行pattern { commands }。重复这个过程,直到文件全部被读取完毕。

(3)、当读至输入流(input stream)末尾时,执行END { commands } 语句块。

BEGIN语句块在awk开始从输入流中读取行之前被执行。这是一个可选的语句块。

END语句块在awk从输入流中读取完所有的行之后即被执行。这个同样是可选的。

最重要的部分就是pattern语句块中的通用命令。这个同样是可选的。如果不提供该语句块,则默认执行的是{ print },即打印每一个读取到的行。awk对于读取到的每一行,都会执行这个语句块.例:

[email protected]:~/learn/awk$ echo -e line1nline2 | awk BEGIN { print “now start” } { print } END { print “this is end” }
now start
line1
line2
this is end

这里首先执行的是BEGIN { print “now start” },然后开始执行默认打印line1nline2 ,最后读完所有的行之后开始执行END语句块{ print “this is end “} 

同样可以将BEGIN和END都去掉,只使用默认的打印方式:

[email protected]:~/learn/awk$ echo -e line1nline2 | awk { print }
line1
line2

这种方式和例1的方式则是相同的。学完这两个例子,基本上就明白了awk到底咋用的了,其格式应该是什么样,即已经入门了。

3、关于print

这里的print和C语言中的基本上差别不大,但C语言我早已经忘的差不多了。还是来看看awk里的print是怎么使用的吧?

有两点需要注意:

1、当print的参数是以逗号进行分隔时,参数打印时则以空格作为定界符。

2、在awk 的print语句中,双引号是被当做拼接操作符的(concatenation operator) ,所以模式匹配最外层尽量使用单引号.

关于1,举例说明:

[email protected]:~/learn/awk$ echo | awk { var1=”v1″;var2=”v2″; print var1,var2 }
v1 v2

这里print var1,var2用的是逗号进行分隔的,所以打印时是以空格作为定界符的。那如果不以逗号进行分隔呢?

[email protected]:~/learn/awk$ echo | awk { var1=”v1″;var2=”v2″; print var1 var2 }
v1v2

打印的时候v1v2贴到一块去了。如果再用其它符号进行分隔,打印会出错(我试了| : /)。

关于2,举例说明:

[email protected]:~/learn/awk$ echo | awk { var1=”v1″;var2=”v2″; print var1“+” var2 }
v1
+v2

这里使用了”+”,双引号果然起到了连接的作用。

 

4、特殊变量

NR:表示记录数量(number of  records),表示当前行号,和cat命令中-n 意思一样。

NF:表示字段数量(number of fields),表示当前行的字段数量

$0,$1,$2,$n…. 前面已经说过,$0表示输出所有文本内容,$n表示第n行数据。

举例说明NR和NF:

下面是NF 

[email protected]:~/learn/awk$ cat test.txt | awk { print NF }
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12

每一行都有12个字段,”1067 root      20   0  200m  49m  11m S    2  1.3   4:43.91 Xorg”,这里字段的定义不是字母数量,而是由空格隔开产生的一列为一个字段,

也可以理解为列数;

下面是NR:

[email protected]:~/learn/awk$ cat test.txt | awk { print NR }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

一共有15行。

5、将外部变量值传递给awk,-v参数

[email protected]:~/learn/awk$ var=99;
[email protected]-pc:~/learn/awk$ echo | awk -v vr=$var { print vr }
99

首先,定义一个var变量,赋值99;然后,将var变量的值在外部再赋给vr;最后打印出vr。

其实就是借值传值。但是当要传递很多参数时就蛋疼了,太麻烦了。下面介绍一个相对简便的方法进行外部传值。

[email protected]:~/learn/awk$ echo | awk { print y1,y2 } y1=$v1 y2=$v2
1 2

这里没有使用-v参数,只是将y1=$v1传值放到后面去了,其实就是将y1=$v1 y2=$v2 当成file了 类似 awk ‘{print }’ file。

6、使用awk进行过滤

1)只显示前四行,行数小于5,和head test.txt -n 4 效果一样。

[email protected]:~/learn/awk$ awk NR<5 test.txt
1067 root 20 0 200m 49m 11m S 2 1.3 4:43.91 Xorg
3009 amosli 20 0 534m 21m 12m S 1 0.5 0:14.75 gnome-terminal
1002 mongodb 20 0 623m 15m 4728 S 1 0.4 0:41.17 mongod
2412 amosli 20 0 1005m 125m 17m S 1 3.2 0:48.61 chrome

2)只显示3-5行内容.

[email protected]:~/learn/awk$ awk NR==3,NR==5 test.txt
1002 mongodb 20 0 623m 15m 4728 S 1 0.4 0:41.17 mongod
2412 amosli 20 0 1005m 125m 17m S 1 3.2 0:48.61 chrome
3775 root 20 0 0 0 0 S 1 0.0 0:00.98 kworker/0:0

3)只显示包含amos的行

[email protected]:~/learn/awk$ awk /amos/ test.txt
3009 amosli 20 0 534m 21m 12m S 1 0.5 0:14.75 gnome-terminal
2412 amosli 20 0 1005m 125m 17m S 1 3.2 0:48.61 chrome
3829 amosli 20 0 17344 1356 952 R 1 0.0 0:00.11 top
2102 amosli 20 0 686m 8280 3508 S 0 0.2 0:10.11 hud-service
2176 amosli 20 0 419m 10m 8448 S 0 0.3 0:00.11 telepathy-indic

7、awk的内建函数

toupper(string),将字符串转为大写

[email protected]:~/learn/awk$ awk { print toupper(“yes”) }

YES

length,长度

[email protected]:~/learn/awk$ awk { print length } test.txt 80
80
80
80
80
80
80
80
80
80
80
80
80
80
72

sqrt()取平方根

[email protected]:~/learn/awk$ awk { print sqrt(4)}

2

awk的功能非常强大,知识点也非常多,网上资料也非常多,这里主要学习的是linux shell脚本攻略第1版内容,awk的内容还需要更进一步的学习!

 

总结下: 这将是近半个月来linux学习的最后一篇文章了,shell脚本入门容易,但是,学过就忘,抽空一定要将这20篇内容再回顾一遍。shell功能非常强大,主要在于命令太多,灵活性较高,每个命令都有很多地方去深究。想要真正掌握所学命令那就是反复的用,不用,学了也没意义了。我的编程最大的心得就是实践,动手实践,人都是眼高手低,一定要多动手!

 

awk进一步学习参考资料:

     1、awk学习笔记

     2、awk英文文档

     3、awk简明教程

 

 

 

 

 

 

本文链接:http://www.cnblogs.com/amosli/p/3498691.html,转载请注明。



You must enable javascript to see captcha here!

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress

无觅相关文章插件,快速提升流量