awk是何方神圣呢?
最简单地说, AWK 是一种用于处理文本的编程语言工具。 AWK 实用工具的语言在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行(后面的测试中充分的验证了这一点),查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
尽管操作可能会很复杂,但命令的语法始终是:
awk '{pattern + action}' //pattern 即正则表达式
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
以“//”开头的,是个人的理解注释。在shell中,注释的标识符是#号。
用到的文件grade的内容如下:
[root@biao LinuxTest]# cat grade
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
[root@biao LinuxTest]# awk 'BEGIN {print "name/n------"}{print $1} END {print "end-of-report"}' grade
name
------
M.Tansley
J.Lulu
P.Bunny
J.Troll
L.Tansley
end-of-report
[root@biao LinuxTest]# awk '$3~/48/ {print $0}' grade
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
[root@biao LinuxTest]# awk '$3=="48" {print $0}' grade
P.Bunny 02/99 48 yellow 12 35 28
[root@biao LinuxTest]# awk ' $4!~/Brown/ {print $0}' grade
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 yellow 12 35 28
[root@biao LinuxTest]# awk ' $4!="Brown-2" {print $0}' grade
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
[root@biao LinuxTest]#
p10 //表示的是老师给的PPT的页数。
[root@biao LinuxTest]# awk '/[Gg]reen/' grade
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
[root@biao LinuxTest]# awk '$1 ~/^...a/' grade
M.Tansley 05/99 48311 Green 8 40 44
L.Tansley 05/99 4712 Brown-2 12 30 28
[root@biao LinuxTest]# awk '$1=="P.Bunny" && $4=="yellow" {print $0}' grade
P.Bunny 02/99 48 yellow 12 35 28
[root@biao LinuxTest]# awk '$1=="P.Bunny" || $4=="yellow" {print $0}' grade
P.Bunny 02/99 48 yellow 12 35 28
[root@biao LinuxTest]#
p10
字段分隔符默认是空格,可用-F指定
p11 awk 内置变量
NF 浏览记录的域个数
NR 已读的记录数
p12
[root@biao LinuxTest]# awk 'END {print NR}' grade
5
[root@biao LinuxTest]# awk '{print NF,NR,$0} END {print FILENAME}' grade //打印记录数,列数 该行
7 1 M.Tansley 05/99 48311 Green 8 40 44
7 2 J.Lulu 06/99 48317 green 9 24 26
7 3 P.Bunny 02/99 48 yellow 12 35 28
7 4 J.Troll 07/99 4842 Brown-3 12 26 26
7 5 L.Tansley 05/99 4712 Brown-2 12 30 28
grade
[root@biao LinuxTest]# echo $PWD | awk -F/ '{print $NF}'
LinuxTest
p13 修改域
[root@biao LinuxTest]# awk '{if($1=="M.Tansley") $6=$6-1; print $1,$6,$7}' grade
M.Tansley 39 44
J.Lulu 24 26
P.Bunny 35 28
J.Troll 26 26
L.Tansley 30 28
[root@biao LinuxTest]# awk '{if($1=="M.Tansley") {$6=$6-1; print $1,$6,$7}}' grade
M.Tansley 39 44
[root@biao LinuxTest]#
p14 先打印 Name 制表符 Difference 如果第6列的值小于第7列的值 创建第8列=第7列-第6列 打印第1列和第8列
[root@biao LinuxTest]# awk 'BEGIN { print "Name /t Difference"} {if ($6<$7) {$8=$7-$6;print $1,$8}}' grade
Name Difference
M.Tansley 4
J.Lulu 2
[root@biao LinuxTest]#
p15 /^[^d]/ 匹配不是d开头的行
[root@biao LinuxTest]# awk '(tot+=$6);END {print "club student total points:" tot}' grade
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
club student total points:155
[root@biao LinuxTest]# ls -l |awk '/^[^d]/ {print $8"/t"$5} {tot+=$5} END {print "total KB:"tot}'
16:07 2545
16:04 2230
16:08 527360
15:08 184
15:08 0
total KB:532319
p18 内置的字符串函数
[root@biao LinuxTest]# awk 'BEGIN {print index("Bunny","ny")}' grade
4 //返回后者在前者的第一个位置
[root@biao LinuxTest]# awk '$1=="J.Troll" {print length($1)" " $1}' grade
7 J.Troll //打印$1的长度
[root@biao LinuxTest]# awk 'BEGIN {print match ("ABCD","A")}'
1 //判断前者是否包含后者
[root@biao LinuxTest]#
p19
/b 退格键 /t tab键
/f 走纸换页 /ddd 八进制值
/n 新行 /c任意其他特殊字符,例如//为反斜线符号
/r 回车
awk 'BEGIN {print "/nMay/tday/n/nMay/t/104/141/171"}'
[root@biao LinuxTest]# awk 'BEGIN {print "/nMay/tday/n/nMay/t/104/141/171"}'
May day
May Day
[root@biao LinuxTest]#
p21 输出函数printf
[root@biao LinuxTest]# echo "65" | awk '{printf "%c/n",$0}' //c是ASCii 码
A
[root@biao LinuxTest]# echo "65" | awk '{printf "%f/n",$0}' //f是浮点数
65.000000
[root@biao LinuxTest]# awk '{printf "%-15s %s/n",$1,$3}' grade //-是对齐 s是字符串 不是很理解这语句
M.Tansley 48311
J.Lulu 48317
P.Bunny 48
J.Troll 4842
L.Tansley 4712
p22 将命令写入文件
[root@biao LinuxTest]# cat awkfile
/^Mary/{print "Hello Mary!"} //如果以Mary开头的就打印 Hello Mary 之后再打印1 2 3列;否则,只打印1 2 3列
{print $1,$2,$3}
[root@biao LinuxTest]# awk -f awkfile ep
Tom Jones 4424
Hello Mary!
Mary Adams 5346
Sally Chang 1654
Billy Black 1683
[root@biao LinuxTest]#
p23 脚本文件
[root@biao LinuxTest]# cat grade //查看grade文件内容
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
[root@biao LinuxTest]# cat tot //查看tot文件内容
#!/bin/awk -f
#print a header first
BEGIN{
print "Student Date No. Grade Age Points Max"
print "Name Joined Gained Point Availabe"
print"==========================================================="
}
#let's add the scores of points gained
(tot+=$6)
END{
print "Club student total Points :" tot
print "Average Club student points:" tot/NR
}
[root@biao LinuxTest]# ./tot grade //执行脚本
Student Date No. Grade Age Points Max
Name Joined Gained Point Availabe
===========================================================
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
Club student total Points :155
Average Club student points:31
[root@biao LinuxTest]#
只是单纯对老师课件上的命令的测试,基本上都能理解其意思!现在处于接触阶段,很多东西还需更加系统点的了解。而且生活,学习中,很少用到这些命令的话,迟早会忘光的! 对于awk的所有命令来说,以及其强大的应用,这只是冰山的一角而已。