转载自董的博客

1. 什么是awk

awk是Unix/Linux提供的样式扫描与处理工具,非常擅长处理结构化数据和生成表单。与sed 和grep 很相似,但功能却超过大于两者,由于awk具备各种脚本语言的特点,所以也可以把它看做一种脚本语言。本文介绍了awk的使用方法。

2. awk程序设计模型

awk程序由三部分组成,分别为:初始化(处理输入前做的准备,放在BEGIN块中),数据处理(处理输入数据),收尾处理(处理输入完成后要进行的处理,放到END块中)。其中,在“数据处理”过程中,指令被写成一系列模式/动作过程,模式是用于测试输入行的规则,以确定是否将应用于这些输入行。

3. awk调用方式

主要有三种调用方式,分别为:

(1) awk 命令行

你可以象使用普通UNIX 命令一样使用awk,在命令行中你也可以使用awk 程序设计语言,,这种方法一般只用于解决简单的问题。当然,你也可以在shell script 程序中引用awk 命令行甚至awk 程序脚本。

(2) 使用-f 选项调用awk 程序

awk 允许将一段awk 程序写入一个文本文件,然后在awk 命令行中用-f 选项调用并执行这段程序。

(3) 利用命令解释器调用awk 程序

利用UNIX 支持的命令解释器功能,我们可以将一段awk 程序写入文本文件,然后在它的第一行加上#!/bin/awk –f.

4. awk语法

与其它 UNIX 命令一样,awk 拥有自己的语法:

awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]

(1) -F re:允许awk 更改其字段分隔符。

(2) parameter:该参数帮助为不同的变量赋值。

(3) ‘prog’:awk 的程序语句段。这个语句段必须用单拓号:’和’括起,以防被shell 解释。这个程序语句段的标准形式为:’pattern {action}’

其中pattern 参数可以是egrep 正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成。与sed 类似,你也可以使用”,”分开两样式以选择某个范围。action 参数总是被大括号包围,它由一系列awk 语句组成,各语句之间用”;”分隔。awk 解释它们,并在pattern 给定的样式匹配的记录上执行其操作。你可以省略pattern 和action 之一,但不能两者同时省略,当省略pattern 时没有样式匹配,表示对所有行(记录)均执行操作,省略action时执行缺省的操作——在标准输出上显示。

(4) -f progfile:允许awk 调用并执行progfile 指定有程序文件。progfile 是一个文本文件,它必须符合awk 的语法。

(5) in_file:awk的输入文件,awk 允许对多个输入文件进行处理。值得注意的是awk 不修改输入文件。如果未指定输入文件,awk 将接受标准输入,并将结果显示在标准输出上。

5. awk脚本编写

5.1 awk的内置变量

awk中有两类内置的变量,一类用户可根据需要改变,主要有:FS:输入数据的字段分割符,RS:输入数据的记录分隔符,OFS:输输出数据的字段分割符,ORS:输出数据的记录分隔符;另一类是系统自动改变的,如:NF:当前记录的字段个数,NR:当前记录编号等。

举例说明:

awk -F”:” ‘{ print $1 ” ” $3 }’ /etc/passwd #打印passwd中的第1,3个字段

5.2 pattern/action模式

awk程序部分采用了pattern/action模式,即,针对匹配pattern的数据,使用action逻辑进行处理。

举例说明:

/^$/ {print “This is a blank line!”} #判断当前是不是空格

$5 ~ /MA/ {print $1 “,” $3} #判断第5个字段是不是含有“MA”

NF == 3 { print “this particular record has three fields: ” $0 }

5.3 BEGIN和 END

在 awk中两个特别的表达式,BEGIN和 END,这两者都可用于 pattern中,提供 BEGIN 和 END 的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在 BEGIN 之后列出的操作(在{}内)将在 awk 开始扫描输入之前执行,而 END 之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来初始化变量,使用END 来输出最终结果。

例:累计销售文件xs 中的销售金额(假设销售金额在记录的第三字段) :

$awk

>’BEGIN { FS=”:”;print “统计销售金额”;total=0}

>{print $3;total=total+$3;}

>END {printf “销售金额总计:%.2f”,total}’ sx

5.4 循环语句

Awk中的循环语句与C很相似,包括do…while,for,continue/break,while等

5.5 条件语句

Awk中的条件语句与C相似,但它有更好地支持。

举例说明:

if(x ~ /[yY](es) ?/) print x #如果x符合pattern “[yY](es) ?”,则打印出来

{ if ( $0 !~ /matchme/ ) { print $1 $3 $4}} #如果$0不包含“matchme”,则打印第1,3,4个字段

5.6 函数

(1) 数学函数

Awk中包含丰富的数学函数,包括:cos(x),sin(x),log(x),….

(2) 字符串函数

Awk中包含丰富的字符串函数,如:

length(x):求字符串x的长度

index(t,s):返回字符串s在字符串t中的位置

match(s,r):正则表达式r在字符串s中出现位置

(3) 自定义函数

awk允许自定义函数,语法是:function name(parameter-list) {statements;}

如:

Function insert(STRING, POS, INS) {

before_tmp = substr(STRING, 1, POS)

after_tmp = substr(STRING, POS + 1)

return before_tmp INS after_tmp

}

调用方法:print insert($1, 4, “XX”)

6. Awk与shell混用

因为 awk 可以作为一个 shell 命令使用, 因此 awk 能与 shell 批处理程序很好的融合在一起,这给实现 awk 与 shell 程序的混合编程提供了可能。实现混合编程的关键是 awk 与shell script之间的对话, 换言之, 就是awk与shell script之间的信息交流:awk从shell script中获取所需的信息(通常是变量的值)、在 awk 中执行 shell 命令行、shell script 将命令执行的结果送给 awk处理以及 shell script读取 awk的执行结果等等。

6.1. awk读取Shell script程序变量

在awk中我们可以通过“’$变量名’”的方式读取sell scrpit程序中的变量。

例如:读取shell scrpit程序中的变量name

下面给出两种方式:

第一种比较常用的方式:(双引号和单引号的意义需要明确)

#!/bin/sh

name=’John’

awk ‘{print $1,$2,”‘$name’”}’ myfile

————————————————-

第二种方式:

#!/bin/sh

name=’John’

awk ‘{print $1,$2,myname}’ myname=$name myfile

不过这种方式中,awk自定义变量myname不能在BEGIN中使用。

6.2. 将shell命令的执行结果送给awk处理

作为信息传送的一种方法,我们可以将一条shell命令的结果通过管道线(|)传递给awk处理:

例:示例awk处理shell命令的执行结果

$who -u | awk ‘{printf(“%s正在执行%s\n”,$2,$1)}’

6.3. shell script程序读awk的执行结果

shell中可以将awk执行结果赋值给shell变量。我们可以用变量名=`awk语句`的形式将awk执行的结果存放入一个shell script变量。当然也可以用管道线的方法将awk执行结果传递给shell script程序处理。

例如:找出myfile中带有fail字符串的行并统计行数,最后打印出格式为:there are (行数) lines

#!/bin/sh

temp=`awk ‘/fail/{print $0}’ myfile |wc -l`

echo “there are $temp lines

7. 参考资料

(1) http://fanqiang.chinaunix.net/program/other/2005-09-07/3621.shtml

(2) 《Unix awk使用手册》,作者:莫名 发表时间:2002/01/27 01:39pm

(3) 书籍《sed 与 awk》修订第三版

转载自董的博客

awk使用总结的更多相关文章

  1. awk命令简介

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  2. awk使用说明

    原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...

  3. awk应用

    h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...

  4. 3.awk数组详解及企业实战案例

    awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...

  5. shell——awk

    awk -F"分隔符" "command" filename awk -F":" '{print $1}' /etc/passwd 字段引用 ...

  6. 【Linux】AWK入门

    什么是AWK AWK是一种用于处理文本的编程语言工具,一个模式匹配程序.一个典型的示例是将数据转换成格式化的报告. 在命令行输入如下awk命令: awk -F":" '{ prin ...

  7. 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od

    awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk ''  | output 1.首先要知道形式 awk 'command' fi ...

  8. sed awk grep三剑客常用

    sed的常用用法: awk的常用用法: grep的常用用法: 除了列出符合行之外,并且列出后10行. grep -A 10 Exception kzfinance-front.log 除了列出符合行之 ...

  9. awk命令速查

    awk与sed.grep一样都是为了加工数据流而做成的文本加工过滤器命令.awk会事先把输入的数据根据字段单位进行分割.在没有制定分割单位的情况下,以输入数据中的空格或Tab为分隔符.与sed相比,它 ...

  10. Sed、Awk单行脚本快速参考

    文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s\n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行. # 这样在输出的文本 ...

随机推荐

  1. JavaScript基础笔记(五) 函数表达式

    函数表达式 一.闭包 概念:闭包是指有权访问另一个函数作用域中变量的函数. function createCompareFun(propertyName) { return function (obj ...

  2. Django——支付宝支付功能

    前期准备 首先我们需要获得支付宝提供的权限与接口,在蚂蚁开放平台进行相关申请:https://openhome.alipay.com/platform/appDaily.htm?tab=info 申请 ...

  3. 关于ajax请求后js绑定事件失效问题解决方法

    <script> $(function(){ $(document).on('click', '.add' ,function(){ window.location.href=" ...

  4. BZOJ3499 : PA2009 Quasi-template

    建立后缀树,用线段树合并求出每个节点子树内部最靠前和最靠后的后缀位置以及相邻后缀距离的最大值,同时求出每个子串能完整匹配的最长后缀的长度. 对于一个子串,如果其长度不小于相邻后缀距离的最大值,且最靠后 ...

  5. C#7.0&6.0新特性 — 完整版

    C#2.0 泛型 部分类型 匿名方法 迭代器 可空类型 Getter / setter单独可访问性 方法组转换(代表) Co- and Contra-variance for delegates 静态 ...

  6. 小甲鱼Python第五讲课后习题

    0.Python中,int表示整型 bool:布尔类型 float:浮点型 str:字符串类型 1.为什么布尔类型(bool)的TRUE和FALSE分别用0和1表示? 计算机只认识二进制,由于二进制只 ...

  7. Sargable 与 谓语下推 (predicate pushdown) 简介

    关键词:SQL优化 , sargable , pushdown filter , predicate pushdown Sargable Sargable = Search ARGument ABLE ...

  8. javaScript系列 [01]-javaScript函数基础

    [01]-javaScript函数基础 1.1 函数的创建和结构 函数的定义:函数是JavaScript的基础模块单元,包含一组语句,用于代码复用.信息隐蔽和组合调用. 函数的创建:在javaScri ...

  9. 近期 Unity 提交苹果审核被拒的问题

    游戏提交苹果审核,被打回.在 bugly 上没有查到崩溃信息,苹果给了 crash 日志也说明. 拒绝原因如下: Your app crashed on iPad or iPhone running ...

  10. Android CollapsingToolbarLayout使用介绍

    我非常喜欢Material Design里折叠工具栏的效果,bilibili Android客户端视频详情页就是采用的这种设计.这篇文章的第二部分我们就通过简单的模仿bilibili视频详情页的实现来 ...