awk命令的一些简单用法

awk简介

AWK

其中pattern表示AWK在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。

awk命令的输入

awk命令采用两种类型的输入:文本文件和程序指令

文本文件

搜索和操作在输入文本文件上执行:

  • 命令行指定文件
  • 修改特殊变量ARGVARGC
  • 未提供文件的情况下提供标准输入

程序指令

用户提供的指令控制 awk 命令的操作。这些指令来自命令行的Program变量或来自用 -f 标志和 ProgramFile 变量一起指定的文件。如果指定多个程序文件,这些文件按指定顺序并置,且使用指令的生成的顺序。

awk命令的输出

awk命令有三种输出类型:

  • 选定数据直接打印至标准输出,此输出等同于文本文件
  • 输入文件的选定部分可更改
  • 选定数据更改并打印

awk命令编程语言

awk程序是由一系列模式–动作对组成的,写做

pattern { action }

awk命令编程语言主要包含如下四种模式

正则表达式

类似于grep的使用方式。例如给定文本文件

smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

输入命令awk '/smi/' testfile,可以在标准输出看到如下结果

smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

匹配多个字符串可使用连接符+,例如输入命令awk '/smith+ern/' testfile,可看到结果

smithern, harry
smithhern, anne

正则表达式其他通配符可自行尝试。

关系表达式

awk同样支持关系运算符<,>,<=,>=,==,!=
例如给定文本文档

smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

输入以下命令awk 'BEGIN{FS=","}{if(length($1) > 6)print $1}' testfile,可得到结果

smawley, andy
smithern, harry
smithhern, anne
smitters, alexis

对于有编程基础的读者来说上面的命令很容易理解。首先设置FS即设置分隔符为,,然后判断长度大于6才进行输出,这里可能会不明白$1代表的含义。我理解$+数字代表的是对每行文本分隔以后的引用。$0代表内容本身,$1代表第一列以此类推。

模式组合

在上一节的例子中其实我们已经看到了多种模式的组合可以更方便完成我们想要的结果。

BEGIN/END模式

之前的例子中使用了BEGIN模式。用 BEGIN 模式指定的操作在读取任何输入之前执行。用 END 模式指定的操作在读取了所有输入后执行。允许多个 BEGINEND 模式,并以指定的顺序处理它们。有兴趣的读者可以试试之前的例子如果不使用BEGIN模式会得到什么结果。

操作

语法规则

awk支持类似c语言的语法,包括算术语句,一元表达式,增量和减量语句,赋值语句,条件语句,函数调用,自定义函数等等。不过变量定义有些不同,类似于python的方式可直接定义不需要添加变量类型或者以其他关键字开头。例如给定如下形式的日志文件

2018-12-03 13:26:47.012 INFO cn.xxx.xxx.xxx.xxx.xxxAction: [82] - [XXX] Resp-client busCode:00000 trace:_a76b93c501c97136461c4e39884e007c timeUsed=18 data={“code”:“110001”,“msg”:“对不起,服务器暂时无法响应,请稍后再试”}

需要统计其中累计耗时,可使用如下命令

cat INFO.log | awk '{for(i = 1;i < 25;i++){if($i != null && match($i,"timeUsed")){count += substr($i,10)}}}END{print "count: ", count}'

其中首先循环找出符合条件的列,然后截取时间后累加,获取到所有输出以后使用END模式输出

特殊变量

awk内置了很多特殊变量,这里仅列举上文提到过的几个。

变量名含义及作用
ARGV其每个成员包含 File 变量之一或 Assignment 变量之一的数组按序从命令行取出,并从 0(零)编号至 ARGC -1。当每个输入文件完成时,ARGV 数组的下一个成员提供下一个输入文件的名称
ARGCARGV 数组中的元素个数。此值可以更改。
FS输入字段分隔符。缺省值是空格。如果输入字段分隔符是空格,那么任何数目的语言环境定义的空格可以分隔字段。
参考文章

https://zh.wikipedia.org/wiki/AWK
https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_72/com.ibm.aix.cmds1/awk.htm#awk__a10498fe

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值