`
阅读更多

http://pengzhenloveseo.blog.163.com/blog/static/163156529201072535047651/

1、$0变量:它指的是整条记录。如$ awk '{print $0}' test将输出test文件中的所有记录。

2、变量NR:一个计数器,每处理完一条记录,NR的值就增加1。如$ awk '{print NR,$0}' test将输出test文件中所有记录,并在记录前显示记录号。

3、内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。

可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:\t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。

4、匹配操作符(~)和不匹配操作符(!~),用来在记录或者域内匹配正则表达式。如$ awk '$1 ~/^root/' test将显示test文件第一列中以root开头的行。$ awk '$1!~/^root/' test将显示test文件第一列中不以root开头的行!

5、复合表达式
语法:(compound expression)

(expr1)&& (expr2)  ------- 与

(expr1)|| (expr2)  ------- 或

说明一下:符合表达式必须用括号括起来

当使用&&时,expr1和expr2必须同时为零(零代表真!呵呵~),复合表达式才为真;

当使用 || 时,expr1和expr2 只要有一个为真,复合表达式则为真!

6、举例:vi data.f(每列后是tab)
48 Dec 3BC1997 LPSX    68.00   LVX2A   138
483 Sept    5Ap1996 USP 65.00   LVX2C   189
47 Oct 3ZL1998 LPSX    43.00   KVM9D   512
219 dec 2CC1999 CAD 23.00   PLV2C   68
484 nov 7PL1996 CAD 49.00   PLV2C   234
483 may 5PA1998 USP 37.00   KVM9D   644
216 sept    3ZL1998 USP 86.00   KVM9E   234


下面的例子重定向输出到新文件:
awk '{print $0}' data.f > data.f.1
使用t e e命令,在输出到文件的同时输出到屏幕:
awk '{print $0}' data.f | tee data.f.2
打印信息头放置在BEGIN模式部分:
awk 'BEGIN {print "Name Belt\n---------------"}{print $1"\t"$4}' data.f
打印信息尾。E N D语句在所有文本处理动作执行完之后才被执行。E N D语句在脚本中的位置放置在主要动作之后:
awk 'BEGIN {print "Name Belt\n---------------"}{print $1"\t"$4} END {print "end-of-report"}' data.f

为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用i f语句。awk中i f后面的条件用()括起来。
如果第1域匹配483的话就把该记录打印出来:
awk '{if($1~/483/) print $0}' data.f
完成同一目的也可以这样写:
awk '$0~/483/' data.f
为精确匹配4 8,使用等号= =,并用单引号括起条件:
awk '{if($1=="48") print $0}' data.f
有时要浏览信息并抽取不匹配操作的记录,与~相反的符号是!~,意即不匹配:
awk '{if($1!~/483/) print $0}' data.f
完成同一目的也可以这样写:(缺省情况下, awk将打印所有匹配记录)
awk '$0!~/483/' data.f
为查询大小写信息,可使用[ ]符号。在测试正则表达式时提到可匹配[ ]内任意字符或单词:
awk '/[lL]PSX/' data.f
抽取名字,其记录第3域的第3个字符是L,使用句点.
awk '$3~/^..L/' data.f
使用竖线符|意为匹配| 两边模式之一。注意,使用竖线符时,语句必须用圆括号括起来:
awk '$0~/(USP|LPSX)/' data.f
复合表达式,&& AND,|| OR,!非:
awk '{if($1=="483" && $2~/^Sept/) print $0}' data.f

要快速查看记录个数,应使用NR。print NR放在E N D语法中:
awk 'END {print NR}' data.f
使用NF变量显示每一条读记录中有多少个域,并在END部分打印输入文件名:
awk '{print NR,NF,$0}END{print FILENAME}' data.f
至少存在一个记录后,查询字符串USP,最后打印结果:
awk '{if(NR>0&&$4~/USP/)print$0}' data.f
NF的一个强大功能是将变量$PWD的返回值传入awk并显示其目录。这里需要指定域分隔符/
echo $PWD | awk -F/ '{print $NF}'


设置输入域到域变量名:
awk '{no=$1;month=$2;if(no=="48") print no" month is " month}' data.f
修改数值域取值:
awk '{if($1=="48") $5=$5-10; print $1,$5,$6}' data.f
修改文本域:(要记住实际输入文件是不可修改的,修改的只是保存在缓存里的awk复本。awk会在变量N R或N F变量中反映出修改痕迹。)
awk '{if($2=="Dec") $2="December";print $0}' data.f
只显示修改记录:
awk '{if($2=="Dec") {$2="December";print $0}}' data.f
创建新的输出域:
awk 'BEGIN {print "No\tMonYear"} {if($2~/[Ss]ept/) {$8=$5-$7; print $2,$8}}' data.f
awk 'BEGIN {print "No\tMonYear"} {if($2~/[Ss]ept/) {diff=$5-$7; print $2,diff}}' data.f
列值增加很有用。许多文件都要求统计总数:
awk '(tol+=$5); END {print "Total money:" tol}' data.f
如果文件很大,你只想打印结果部分而不是所有记录,在语句的外面加上大括号{}即可:
awk '{(tol+=$5)}; END {print "Total money:" tol}' data.f
快速查看所有文件的长度及其总和,但要排除子目录:
ls -l | awk '/^[^d]/ {print $9"\t"$5} {tol+=$5} END {print "Total KB:"tol}'

分享到:
评论

相关推荐

    awk入门到精通.pdf

    此外, awk内建有pipe的功能, 可将处理中的数据传送给外部 的 Shell命令加以处理, 再将Shell命令处理后的数据传回awk程序, 这个特点也使得awk程序很 容易使用系统资源. 由于awk具有上述特色, 在问题处理的过程中, 可...

    Oracle ass.awk工具

    ass.awk工具用在数据库hang住时分析收集到的systemstate所用,可以清晰明了的查看systemstate中的信息; 命令简单: $ awk -f ass1033.awk [trace_name_file] 在系统hung的时候,systemstate基本等同于hanganalyze...

    学习和理解AWK的最佳书籍Effective AWK Programming

    学习和理解AWK的最佳书籍  一致这本书是学习awk的最好书籍,网上下不到的,国内也买不到。国家图书馆和北京大学图书馆都有。强烈建议所有想学awk的同志们阅读(会有很多awk语言之外的启迪) 偶然机会得到,不敢独享...

    AWK_样式扫描和处理语言

    第一章 UNIX AWK使用手册(第二版)......................................................................................5 1.1 什么是AWK?...................................................................

    awk用法小结--有关awk的材料

    awk用法小结 - - - by ruson 2006.4 NTU 1. awk非常适合于结构化的文本文件(行、列数据)复杂处理。相对于sed而言,它可进行复杂的编程处理,并且可以产生复杂的报表输出。 2. awk通常有三个版本,旧awk、nawk...

    The AWK programming language(中文版)

    这本书的作者就是AWK程序语言的设计者,所以其权威性毋庸置疑。值得注意的是这本 书的第二作者Brain W是神一样耳朵科学家,他是《The C programming language》的作者,Brain的《程序设计与实现》也是一本好书。 AWK...

    awk学习awk学习awk学习awk学习

    awk学习awk学习awk学习awk学习awk学习awk学习awk学习

    linux环境下awk开发

    你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是...

    sed_awk.chm

    This book is about a set of oddly named UNIX utilities, sed and awk. These utilities have many things in common, including the use of regular expressions for pattern matching. Since pattern matching ...

    Awk入门教程 《Awk A Tutorial and Introduction - by Bruce Barnett》

    Awk入门教程。作者 Bruce Barnett 注:英文版。以下是目录 Why learn AWK? Basic Structure Executing an AWK script Which shell to use with AWK? Dynamic Variables The Essential Syntax of AWK ...

    Sed与Awk (中文版)

    sed和awk是用户、程序员和管理员应用的工具。之所以称为sed是因为它是一个流编辑器(stream editor),用于对许多文件执行一系列的编辑操作。awk是根据它的开发者Aho、Weinberger和Kernighan命名的。awk是一种编程...

    AWK用法AWK用法AWK用法

    awk ‘/101/’ file 显示文件file中包含101的匹配行。 awk ‘/101/,/105/’ file awk ‘$1 == 5′ file awk ‘$1 == “CT”‘ file 注意必须带双引号 awk ‘$1 * $2 >100 ‘ file awk ‘$2 >5 && $2<=15' file

    无线AP藦萨AWK-3131A

    Moxa AWK-3131A 三合一工业级无线AP/Bridge/Client 支 持IEEE 802.11n 技术,数据传输率高达300Mbps,满足了 不断增长的快速数据传输和信号覆盖范围更广泛的要求。 AWK-3131A 符合各种工业标准,包括工作温度、输入...

    awk使用手册

    你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是...

    AWK手册 中文帮助文档

    AWK中文帮助文档,包含awk详细讲解以及实例程序

    巧用AWK处理二进制数据文件

    awk是unix,linux中处理文本的好工具,本文用一个实例说明awk脚本的编写及使用.

    Awk学习笔记和指南

    awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和 动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。...

    sed与awk(第二版) - PDF(带目录)

    本书在一开始就给出一个概述和指南,论述了从grep到sed再到awk不断改进的功能。sed和awk具有相同的命令行语法,以脚本的形式接收用户的命令。因为所有这三个程序都使用UNIX正则表达式,因此书中用一章的篇幅来介绍...

    Sed与awk 中文第二版

    sed和awk是用户、程序员和管理员应用的工具。之所以称为sed是因为它是一个流编辑器(stream editor),用于对许多文件执行一系列的编辑操作。awk是根据它的开发者aho、weinberger和kernighan命名的。awk是一种编程语言...

Global site tag (gtag.js) - Google Analytics