Linux常用工具使用手册——awk的常用玩法

一. AWK入门指南

Awk是一种便于使用且表达能力强的程序设计语言,可应用于各种计算和数据处理任务。本章是个入门指南,让你能够尽快地开始编写你自己的程序。第二章将描述整个语言,而剩下的章节将向你展示如何使用Awk来解决许多不同方面的问题。纵观全书,我们尽量选择了一些对你有用、有趣并且有指导意义的实例。

1.1 起步

有用的awk程序往往很简短,仅仅一两行。假设你有一个名为 emp.data 的文件,其中包含员工的姓名、薪资(美元/小时)以及小时数,一个员工一行数据,如下所示:

Beth4.000
Dan3.750
kathy4.0010
Mark5.0020
Mary5.5022
Susie4.2518

现在你想打印出工作时间超过零小时的员工的姓名和工资(薪资乘以时间)。这种任务对于awk来说就是小菜一碟。输入这个命令行就可以了::

awk '$3 >0 { print $1, $2 * $3 }' emp.data

你应该会得到如下输出:

Kathy 40

Mark 100

Mary 121

Susie 76.5

该命令行告诉系统执行引号内的awk程序,从输入文件 emp.data 获取程序所需的数据。引号内的部分是个完整的awk程序,包含单个模式-动作语句。模式 $3>0 用于匹配第三列大于0的输入行,动作:

{ print $1, $2 * $3 }

打印每个匹配行的第一个字段以及第二第三字段的乘积。

如果你想打印出还没工作过的员工的姓名,则输入命令行::

awk '$3 == 0 { print $1 }' emp.data

这里,模式 $3 == 0 匹配第三个字段等于0的行,动作:

{ print $1 }

打印该行的第一个字段。

当你阅读本书时,应该尝试执行与修改示例程序。大多数程序都很简短,所以你能快速理解awk是如何工作的。在Unix系统上,以上两个事务在终端里看起来是这样的:

$ awk ‘$3 > 0 { print $1, $2 * $3 }’ emp.data

Kathy 40

Mark 100

Mary 121

Susie 76.5

$ awk ‘$3 == 0 { print $1 }’ emp.data

Beth

Dan

$

行首的 $ 是系统提示符,也许在你的机器上不一样。

AWK程序的结构

让我们回头看一下到底发生了什么事情。上述的命令行中,引号之间的部分是awk编程语言写就的程序。本章中的每个awk程序都是一个或多个模式-动作语句的序列:

pattern { action }

pattern { action }

...

awk的基本操作是一行一行地扫描输入,搜索匹配任意程序中模式的行。词语“匹配”的准确意义是视具体的模式而言,对于模式 $3 >0 来说,意思是“条件为真”。

每个模式依次测试每个输入行。对于匹配到行的模式,其对应的动作(也许包含多步)得到执行,然后读取下一行并继续匹配,直到所有的输入读取完毕。

上面的程序都是模式与动作的典型示例。:

$3 == 0 { print $1 }

是单个模式-动作语句;对于第三个字段为0的每行,打印其第一个字段。

模式-动作语句中的模式或动作(但不是同时两者)都可以省略。如果某个模式没有动作,例如::

$3 == 0

那么模式匹配到的每一行(即,对于该行,条件为真)都会被打印出来。该程序会打印 emp.data 文件中第三个字段为0的两行

Beth 4.00 0

Dan 3.75 0

如果有个没有模式的动作,例如::

{ print $1 }

那么这种情况下的动作会打印每个输入行的第一列。

由于模式和动作两者任一都是可选的,所以需要使用大括号包围动作以区分于其他模式。

1.2 简单输出

这一节接下来的部分包含了一些短小,典型的awk程序,基于操纵上文中提到的 emp.data 文件. 我们会简单的解释程序在做什么,但这些例子主要是为了介绍 awk 中常见的一些简单有用的操作 – 打印字段, 选择输入, 转换数据. 我们并 没有展现 awk 程序能做的所有事情, 也并不打算深入的去探讨例子中的一些细节. 但在你读完这一节之后, 你将能够完成一些简单的任务, 并且你将发现在阅读后 面章节的时候会变的容易的多.

我们通常只会列出程序部分, 而不是整个命令行. 在任何情况下, 程序都可以用 引号包含起来放到 awk 命令的地一个参数中运行, 就像上文中展示的那样, 或者 把它放到一个文件中使用 awk 的 -f 参数调用它.

在 awk 中仅仅只有两种数据类型: 数值 和 字符构成的字符串. emp.data 是 一个包含这类信息的典型文件 – 混合了被空格和(或)制表符分割的数字和词语.

Awk 程序一次从输入文件的中读取一行内容并把它分割成一个个字段, 通常默认 情况下, 一个字段是一个不包含任何空格或制表符的连续字符序列. 当前输入的 行中的地一个字段被称做 $1, 第二个是 $2, 以此类推. 整个行的内容被定 义为 $0. 每一行的字段数量可以不同.

通常, 我们要做的仅仅只是打印出每一行中的某些字段, 也许还要做一些计算. 这一节的程序基本上都是这种形式.

打印每一行

如果一个动作没有任何模式, 这个动作会对所有输入的行进行操作. print 语 句用来打印(输出)当前输入的行, 所以程序

{ print }

会输出所有输入的内容到标准输出. 由于 $0 表示整行,

{ print $0 }

也会做一样的事情.

Linux中awk抽取包含某字段的整行日志

命令示例:
awk '{if($0~"listAuths") print}' xxx.log
解释说明:
抽取xxx.log整个日志文件中,包含“listAuths”的行,打印输出

变量含义

变量名 含义 
ARGC 命令行变元个数 
ARGV 命令行变元数组 
FILENAME 当前输入文件名 
FNR 当前文件中的记录号 
FS 输入域分隔符,默认为一个空格 
RS 输入记录分隔符 
NF 当前记录里域个数 
NR 到目前为止记录数 
OFS 输出域分隔符 
ORS 输出记录分隔符

1,模式匹配
awk '/zqy/' fileA #寻找出fileA中含有zqy的行 等同于awk '$0~/zqy/' fileA
awk '$1~/88/' fileA #找出第一个域里面包含88的行
awk '$1~/88/{print $2}' fileA #找出第一个域里面包含88的行后,只打印该行的第二个域
--------------------- 
作者:润明 
来源:CSDN 
原文:https://blog.csdn.net/runming918/article/details/7229825 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值