`
阅读更多

awk语言
最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。
awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
=================================================================================
有三种方法调用awk

第一种命令行方式
awk [-F field-separator] 'commands' input-file(s)
这里的commmands是真正的awk命令

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

第三种方式是将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
-f选项指明在文件awk_script_file中的awk脚本,input_file(s)是使用awk进行浏览的文件名。
=================================================================================
awk脚本整体结构
任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。

模式部分决定动作语句何时触发及触发事件。
如果省略模式部分,动作将时刻保持执行状态。模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段 BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。 END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式,awk总是匹配或打印行数。

动作即对数据进行的操作。
实际动作在大括号{}内指明。动作大多数用来打印,但是还有些更长的代码诸如if和循环looping语句及循环退出结构。如果不指明采取动作,awk将打印出所有浏览出来的记录。

awk 'BEGIN{print "Name\n------"} {print $1} END{print "end-of-report"}' testfile
文本操作前执行                       文本操作    文本操作后执行

awk的域的概念
awk 执行时,其浏览域标记为$1,$2...$n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。使用$1 , $3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有5个域的记录的所有域,不必指明$1,$2,$3,$4,$5,可使用$0,意即 所有域。awk浏览时,到达一新行,即假定到达包含域的记录末尾,然后执行新记录下一行的读动作,并重新设置域分隔。
awk '{print $0}' testfile
打印整个文件
awk '{print $1,$4}' testfile
打印文件中的第一列和第四列


注意事项:
确保整个awk命令用单引号括起来。
确保命令内所有引号成对出现。
确保用花括号括起动作语句,用圆括号括起条件语句。

=====================================================================================
条件操作符:
<      小于
>=     大于等于
<=     小于等于
==     等于             (字符串用双引号包含)
!=      不等于
!~    不匹配正则表达式(正则表达式用/ /包含)   注意这与grep不同,grep用单引号包含正则表达式
~     匹配正则表达式

awk '{if($4~/Brown/) print $0}' testfile
awk '{if($3~/48/) print $0}' testfile 等价于 awk '$3=="48" {print $0}' testfile 注意:if属于动作,而后者不算在动作里,故不用扩在{}里面
awk '$0~/(Yellow|Brown)/' testfile 注意$0代表整行,默认的动作就是打印
awk '{if($4=="Yellow" || $4~/Brown/) print $0}' testfile 注意:正则表达式里面用 | 而条件判断里面用|| && !
awk '/[Gg]reen/' testfile 注意:$0为默认值,打印为默认动作
=====================================================================================
awk内置变量
ARGC         命令行参数个数
ARGV         命令行参数排列
ENVIRON     支持队列中系统环境变量的使用
FILENAME      awk浏览的文件名
FNR         浏览文件的记录数

FS         设置输入域分隔符,等价于命令行- F选项 field separator
RS         控制记录分隔符 record sepatator
OFS         输出域分隔符
ORS         输出记录分隔符

注意:NF和NR只是一个索引值,就是一个数字,也就是当前光标对应的位置的记录,当对他们取$NF,$NR时,显示的是他们对应的位置的值
NR只增不减,而NF是循环的增减,当达到每行的最大域数的时候时就跳到下一行从新清零。所以常用$NF保留最后一个域值
NF         浏览记录的域个数   number of field 也就是行中域的个数
NR         已读的记录数    number of record 也就是行号

NF变量显示每一条读记录中有多少个域
awk '{if(NR>0 && $4~/Brown/) print NF,NR,$0}' testfile
另一个应用$NF保存最后一个域的值
echo "/usr/local/etc/rc.sybase" | awk -F/ '{print $NF}'

=====================================================================================
在awk中使用操作符
基本表达式可以划分为数字型、字符串型、变量型、域及数组元素。
= += *= /= %= ^=     赋值操作符
?             条件表达操作符
|| && !         并、与、非
~ !~            匹配操作符,包括匹配和不匹配
< <= == != >>     关系操作符
+ - * / % ^     算术操作符
++ --             前缀和后缀


设定有意义的域值变量
$1..没有意义,应该设定有意义的变量
awk '{name=$1;belts=$4;if(belts ~/Yellow/) print name" is belt "belts}' testfile

域值比较
有两种方式测试一数值域是否小于另一数值域。
1) 在BEGIN中给变量名赋值。
2) 在关系操作中使用实际数值。
通常在BEGIN部分赋值是很有益的,可以在awk表达式进行改动时减少很多麻烦。
awk 'BEGIN{BASELINE="27"} {if ($6<BASELINE) print $0}' grade.txt
注意:BEGIN部分只能使用常量,而不能使用参数如$n,因为此时还没有进行正文处理,会出现错

修改域
当在awk中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的awk复本。
awk会在变量NR或NF变量中反映出修改痕迹。
awk '{name=$1;   if(name=="J.Troll")(name="J.L.Troll")(name="J.K.Troll");    print $1}' testfile
逻辑操作表达式单独使用时要用()括起来,上面的if的范围一直到后面的 ;为止                                          
只显示修改的部分
awk '{name=$1;   if(name=="J.Troll"){name="J.L.Troll";print $1} }' testfile
用{}括起来则表示一个语句块,这样就只显示修改过的部分了

创建新的域
awk 'BEGIN{ print "Name\t Difference"} {if($6<$7) {$8=$7-$6;print $1,$8} }' testfile

统计列值
awk '(tot+=$6); END{print "Club student total points:" tot}'
上述将打印整个文件的内容
awk '{(tot+=$6)}; END{print "Club student total points:" tot}'
用{}括起来的话,动作就不是默认的print了,
应用于统计文件的大小:
ls -l | awk '/^[^d]/ {print $9"\t"$5}{tot+=$5} END{print "total KB:"tot}'
其中$9是文件名,$5是文件的大小,对应于ls命令的输出

======================================================================================
内置的字符串函数
gsub(r,s)     在整个$0中用s替代r
gsub(r,s,t)     在整个t中用s替代r
index(s,t)     返回s中字符串t的第一位置
length(s)     返回s长度
match(s,r)     测试s是否包含匹配r的字符串
split(s,a,fs)     在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s)     用$0中最左边最长的子串代替s
substr(s,p)     返回字符串s中从p开始的后缀部分
substr(s,p,n)     返回字符串s中从p开始长度为n的后缀部分
注意:这些函数都放在BEGIN和END部分使用

awk 标准格式化输出函数printf
类似于C语言的
======================================================================================
参数传递
管道传入字符串
echo "Hello world!" | awk '{print $1}'
作为命令参数传递
awk '{if ($5<AGE) print $0}' AGE=10 grade.txt
=======================================================================================
数组的使用
参看:http://bbs.chinaunix.net/viewthread.php?tid=448687&extra=&page=3
#!/bin/awk -f
#name:belts.awk

BEGIN{
FS="#"

belt["Yellow"]
belt["Orange"]
belt["Red"]

student["Junior"]
student["Senior"]
}
##初始化完成后, BEGIN部分结束。记住BEGIN部分并没有文件处理操作。

#现在可以处理文件了。

{
for (colour in belt)
{
if($1==colour)
belt[colour]++
}
}

{
for (senior_or_junior in student)
{
if ($2==senior_or_junior)
student[senior_or_junior]++
}
}

#END部分打印浏览结果,对每一个数组使用循环语句并打印它。

END{
for (colour in belt )print "The club has ",belt[colour],colour,"Belts"
for (senior_or_junior in student) print "The club has ",student[senior_or_junior],senior_or_junior,"student"
}
======================================================================================
注意在使用awk“脚本”时(而不是命令时,上述讲的都是命令行的),记住设置FS变量是在BEGIN部分。如果不这样做,awk将会发生混淆,不知道域分隔符是什么。

分享到:
评论

相关推荐

    【awk】1-awk基础篇(又名UNIX.Shell.awk).doc

    【awk】1-awk基础篇(又名UNIX.Shell.awk).doc

    awk基础篇学习文档

    AWK是一种编程语言,专门用于文本和数据的模式扫描和处理。在Linux和Unix操作系统中,AWK因其强大的文本处理能力而广泛应用。它的名字来源于其创始人Alfred Aho、Peter Weinberger和Brian Kernighan的姓氏的首字母。...

    《黄振贤-AWK基础培训》

    有关AWK命令的相关基础知识,可以帮助想要学习awk命令的人快速了解

    awk教程入门到精通

    下面是一份 awk 教程,从基础知识到高级应用,涵盖了 awk 的基本概念、语法、函数和应用实例。 awk 基础知识 awk 的基本结构是 pattern{action},其中 pattern 是awk的模式, action 是awk的动作。awk 的模式可以...

    AWK基础教程

    本基础教程将带你深入理解AWK的基本概念,助你快速掌握这一技能。 一、AWK概述 AWK是由三位名字中带有"A"、"W"和"K"的人——Aho、Weinberger和Kernighan共同创建的,因此得名。它是一种编程语言,主要用于处理和...

    Effective AWK Programming:Awk 编程的经典著作

    1. **AWK基础**:介绍AWK的基本概念,包括其工作原理、语法规则以及如何在命令行上运行AWK程序。读者会学习到AWK是如何通过模式空间和动作来处理输入的行,并理解BEGIN和END规则的用途。 2. **模式匹配**:详细讲解...

    非常经典的awk教程

    1. **awk基础知识**: - Awk是由Aho、Weinberger和Kernighan三位开发者命名的,缩写为awk。它是一款用于处理结构化数据的语言,常用于处理文本文件,报告生成,数据分析等。 - awk的工作原理是逐行扫描输入文件,...

    AWK详细文档 使用手册

    **AWK基础知识** AWK基于行处理,每一行被视为一个记录,每个记录可以被分割成多个字段。默认情况下,字段是由空格或制表符分隔的。AWK程序由一系列规则和动作组成,规则定义了何时执行特定的动作。 ### 2. **AWK...

    AWK应用和讲解步骤

    ### 一、AWK 基础语法 AWK 是一个强大的文本处理工具,在 Linux 和 Unix 系统中广泛使用。AWK 的基本命令格式如下: ``` awk [选项] '模式或条件 {动作}' 文件名 ``` #### 选项 - `-F` 或 `--field-separator`:...

    AWK命令资源收集.rar

    1. **AWK基础** - **变量**:AWK中的变量是自动声明的,无需预定义类型,可以是数字或字符串。 - **模式和动作**:AWK程序由模式和动作组成,模式匹配行,动作执行操作。 - **字段分隔符**:默认情况下,AWK按...

    awk实例入门教程.pdf

    随着对awk基础命令和语法的掌握,进一步的学习应包括: 1. **数组使用**:awk支持一维和多维数组,可以用于更复杂的文本处理任务。 2. **函数与自定义函数**:了解内置函数,如`split()`和`gsub()`,并学习如何编写...

    linuxsed与awk第三版

    5. Awk基础:介绍awk的语法结构,如模式和动作,以及内置变量和函数。 6. Awk模式匹配:理解awk中的模式匹配机制,包括字段分割和模式匹配规则。 7. 控制结构:学习如何在awk中使用条件语句(if-else)和循环(for,...

    初步介绍awk入门的一些基础知识

    ### awk基础知识详解 #### 一、awk概述与基础命令 **awk**是一种强大的文本处理工具,在Linux和Unix环境中被广泛使用。它最初由贝尔实验室开发,名称“awk”即为三位开发者Alfred Aho、Peter Weinberger 和 Brian ...

    awk实用手册

    1. **awk基础** awk的工作原理是基于行的处理,它会读取输入文件的一行一行,然后根据指定的模式(pattern)进行匹配,并执行相应的动作(action)。基本语法是`awk 'pattern {action}' file`。例如,`awk '/...

    详解著名的awk_oneliner

    #### 二、awk基础概念 `awk` 是一种强大的文本处理工具,它支持数据提取和报告生成。`awk` 程序通常用于解析文本文件中的数据,并根据特定条件执行操作。`awk` 程序的基本结构包括一系列的“模式{动作}”语句,这些...

    linux文本分析awk基础命令介绍(8)

    ### Linux文本分析之AWK基础命令详解 #### 一、AWK概述 AWK是一种用于文本处理的强大脚本语言,其名称来源于三位开发者 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。AWK 能够对文本进行高效地...

    Linux AWK 命令

    **AWK基础知识** 1. **基本语法**:`awk 'ACTION {COMMAND}' FILENAME`,ACTION是匹配条件,COMMAND是执行的动作,FILENAME是处理的文件。如果ACTION为空,表示对每一行都执行COMMAND。 2. **字段分隔符**:默认情况...

    三剑客-awk.txt

    awk基础

    awk_linux_bash_awk_

    **awk基础知识** `awk`这个名字来源于它的创始人——Aho、Wegman和Kernighan。它的工作原理是在文件或标准输入中逐行扫描,根据用户定义的模式和动作对每一行进行处理。基本语法结构如下: ```awk awk '模式 {动作}'...

    awk教程--别人家的笔记

    #### 八、awk基础示例 继续使用`a.txt`文件,进行以下操作: - **打印列或域** - 示例:`awk -F' ' '{print $2}' a.txt` (打印第二列) - 解析:通过`-F`选项设置字段分隔符为空格,`$2`表示打印第二列内容。 ...

Global site tag (gtag.js) - Google Analytics