`

awk的一些命令测试(第4章 awk)

阅读更多

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的所有命令来说,以及其强大的应用,这只是冰山的一角而已。

分享到:
评论

相关推荐

    shell编程指南,shell脚本,本书共分五部分全。grep家族,sed,AWK,正则表达式,tr用法

    第4章 文件名置换 31 第5章 shell输入与输出 34 第6章 命令执行顺序 46 第二部分 文本过滤 第7章 正则表达式介绍 49 第8章 grep家族 56 第9章 AWK介绍 66 第10章 sed 用法介绍 89 第11章 合并与分割 104 第12章 tr...

    Linux命令学习 shell pdf格式

    第四章 文件名置换 第五章 shell输入与输出 第六章 命令执行顺序 第二部分 文本过滤 第七章 正则表达式介绍 第八章 grep家族 第九章 AWK介绍 第十章 sed用法介绍 第十一章 合并与分割 第十二章 tr用法 第三部分 ...

    Linux Shell 编程 入门、提高、精通

    第4章文件名置换 第5章shell输入与输出 第6章命令执行顺序 第二部分文本过滤 第7章正则表达式介绍 第8章grep 家族 第9章AWK 介绍 第10章sed 用法介绍 第11章合并与分割 第12章tr 用法 第三部分登录环境 第13章登录...

    Linux Shell编程教程

    第4章文件名置换 第5章shell输入与输出 第6章命令执行顺序 第7章正则表达式介绍 第8章grep 家族 第9章AWK 介绍 第10章sed 用法介绍 第11章合并与分割 第12章tr 用法 第13章登录环境 第14章环境和shell变量 第15章...

    LINUXshel详细l编程指南

    第4 章 文件名置换 第5 章 shell输入与输出 第6 章 命令执行顺序 第7 章 正则表达式介绍 第8 章 grep家族 第9 章 AWK介绍 第10章 sed 用法介绍 第11章 合并与分割 第12章 tr用法 第13章 登录环境 第14章 ...

    LINUX与UNIX_Shell编程指南

    第4章 文件名置换 第5章 shell输入与输出 第6章 命令执行顺序 第二部分 文本过滤 第7章 正则表达式介绍 第8章 grep家族 第9章 AWK介绍 第10章 sed 用法介绍 第11章 合并与分割 第12章 tr用法 第三部分 登录环境 第13...

    Linux与unix shell编程指南.rar

    第4章 文件名置换 31 第5章 shell输入与输出 34 第6章 命令执行顺序 46 第二部分 文本过滤 第7章 正则表达式介绍 49 第8章 grep家族 56 第9章 AWK介绍 66 第10章 sed 用法介绍 89 第11章 合并与分割 104 第12章 tr...

    Linux Shell编程从初学到精通 第2版

    第4章 sed命令和awk编程 64 第5章 文件的排序、合并和分割 105 第6章 变量和引用 133 第7章 退出、测试、判断及操作符 157 第8章 循环与结构化命令 187 第9章 变量的高级用法 217 第10章 I/O重定向 243 第11...

    Linux与UNIX Shell编程指南.rar

    第四章 文件名置换 第五章 SHELL输入输出 第六章 命令执行顺序 第二部分 文本过滤 第七章 正则表达式介绍 第八章 GERP家族 第九章 AWK介绍 第十章 SED用法介绍 第十一章 合并与分割 第十二章 TR用法 第三部分 登录...

    shell脚本详解

    第4章_文件名置换; 第5章_shell输入与输出; 第6章_命令执行顺序; 第7章_正则表达式介绍; 第8章_grep家族; 第9章_awk介绍; 第10章_sed用法介绍; 第11章_合并与分割; 第12章_tr用法; 第13章_登录环境; 第14...

    linux与unix shell编程指南

    第4章文件名置换.PDF 第5章shell输入与输出.PDF 第6章命令执行顺序.PDF 第7章正则表达式介绍.PDF 第8章grep 家族.PDF 第9章AWK 介绍.PDF 第10章sed 用法介绍.PDF 第11章合并与分割.PDF 第12章tr 用法.PDF 第13章登录...

    LINUX与UNIX SHELL编程指南

    第4章文件名置换.PDF 第5章shell输入与输出.PDF 第6章命令执行顺序.PDF 第7章正则表达式介绍.PDF 第8章grep 家族.PDF 第9章AWK 介绍.PDF 第10章sed 用法介绍.PDF 第11章合并与分割.PDF 第12章tr 用法.PDF 第13章登录...

    Linux与UNIX Shell编程指南.

    第四章 文件名置换 第五章 SHELL输入输出 第六章 命令执行顺序 第二部分 文本过滤 第七章 正则表达式介绍 第八章 GERP家族 第九章 AWK介绍 第十章 SED用法介绍 第十一章 合并与分割 第十二章 TR用法 第三部分 登录...

    Linux Shell脚本自动化编程实战.zip

    第4章__循环及并发控制 第5章__非交互式expect 第6章__数组应用实战 第7章__函数传参及返回 第8章__Shell内置命令 第9章__RE正则表达式 第10章__Sed流编辑器 第11章__awk文本处理工具实战 第12章__项目实战之 系统...

    绝版经典 LINUX与UNIX SHELL编程指南 PDF 高清版 [16.3M]

    第四章 文件名置换 第五章 SHELL输入输出 第六章 命令执行顺序 第二部分 文本过滤 第七章 正则表达式介绍 第八章 GERP家族 第九章 AWK介绍 第十章 SED用法介绍 第十一章 合并与分割 第十二章 TR用法 第三...

    shell编程和unix命令

    第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1...

Global site tag (gtag.js) - Google Analytics