1、前言

awk是Unix环境下一种非常好的语言,适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行特殊技巧程序设计。对于短消息来说,比如处理话单文件,使用awk就非常方便,鉴于测试组大部分人对awk并不熟悉,因此仅以本文作一个提纲挈领的介绍,希望对初学者迅速掌握awk有所帮助。

2、第一部分:入门

2.1 第一个awk程序

所有的编程书籍都是通过一个“Hello world!”简单程序入门,作为借鉴,本文也采用此方法带大家入门。现在,在当前目录下建立一个文本文件hello.txt,内容如下:

Hello world!
在命令行中输入以下命令

awk '{print}' hello.txt 

执行后hello.txt文件的内容显示在屏幕上。编写并且执行awk程序的方法很简单,如上所示,花括号内的是程序代码,后面的hello.txt为指定的输入文件。awk是一种行处理程序,执行awk时,它依次对输入文件中的每一行执行花括号中的代码,如上面的例子,就是对hello.txt中的每一行执行print命令。所有输出都发送到stdout,最后在屏幕上显示的结果为“Hello world!”。

上面的例子是将脚本作为命令行自变量传递给awk,我们也可以把脚本写入一个外部文件,然后通过-f选项向awk传递这个脚本文件。例如编写脚本文件hello.awk如下:

{print} 

然后通过如下方式执行:

awk -f hello.awk hello.txt 

2.2 常用变量

这种编写独立脚本文件的方式应用在多行、比较复杂的程序上,非常合适,而且,在后面你还将看到,这种方式还可以让你非常方便地使用附加awk功能。

awk有自己的特殊变量集合。其中一些允许调整awk的运行方式,而其它变量可以被读取以收集关于输入的有用信息。下面列举出最基本的几个常用变量,并用例子一一说明用法.

Awk特殊变量 描述
$number 表示记录的字段。比如,$1表示第1个字段,$2表示第2个字段,如此类推。而$0比较特殊,表示整个当前行
FS(filed separate) 表示字段分隔符
NF  (filed number) 表示当前记录中的字段数量
NR  (row number) 表示当前记录的编号(awk将第一个记录算作记录号1)

为了便于举例说明,在当前目录下生成一个历史话单文件bill(注意,是一行内容,中间没有换行符),其内容如下:

4429300,0,8613902700001,8613902700002,8613800288500,2004/06/26 10:31:33,2004/06/26 10:31:33,0,0,0,4,6,1,0,0,0,,0,2004/06/26 10:31:32,NULL,1,0,0,nihao@,
4429300,0,8613902700001,8613902700003,8613800288500,2004/06/26 10:31:33,2004/06/26 10:31:33,0,0,0,4,6,1,0,0,0,,0,2004/06/26 10:31:32,NULL,1,0,0,nihao@,
 我们可以使用$0变量将整个bill文件内容读出:

awk '{ print $0 }' bill 

可以看出,在awk中,print和print $0的作用完全一样。

使用$number变量,对多个字段的文本进行处理,将变得非常容易,它可以让你毫不费力地引用每个独立的字段。例如,我们可以列出主叫号码和被叫号码:

awk -F"," '{ print $3,$4 }' bill 

上例中,在调用awk时,使用-F选项来指定","作为字段分隔符。awk处理后打印出主叫号码字段和被叫号码字段。而且,你还可以在字段中插入字符,比如:

awk -F"," '{ print "OrgAddr: "$3, "\tDestAddr: "$4 }' bill 

以下是该脚本输出:

OrgAddr: 8613902700001 DestAddr: 8613902700002
OrgAddr: 8613902700001 DestAddr: 8613902700003
以上命令中,我们是通过-F选项来指定字段分隔符的。如果我们使用的是脚本文件,则就要用到FS变量来设置字段分隔符。编写脚本文件bill.awk如下:

BEGIN { FS=","
} { print "OrgAddr: "$3, "\tDestAddr: "$4 } 

建议最好用脚本文件,这样方便日后重复利用,也方便修改。

FS值并没有被限制为单一字符,可以通过指定任意长度的字符模式,将它设置成正则表达式。如果正在处理由一个或多个tab分隔的字段,可以按以下方式设置FS:

FS="\t+" 

另外,这个脚本里出现了陌生的BEGIN,有必要解释一下。通常,对于每个输入行,awk都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在awk开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk允许你定义一个BEGIN块。我们在上面的例子中使用了BEGIN块。因为awk在开始处理输入文件之前会执行BEGIN块,因此它是初始化FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。

awk还提供了另一个特殊块,叫作END块。awk在处理了输入文件中的所有行之后执行这个块。通常,END块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

NF变量,也叫做“字段数量”变量。awk会自动将该变量设置成当前记录中的字段数量。可以使用NF变量来只显示某些输入行:

NF == 3 { print $1,$2,$3 } 

NR变量始终包含当前记录的编号(awk将第一个记录算作记录号1)。迄今为止,我们处理的输入文件每一行包含一个记录,对于这些情况,NR就是当前行号。可以象使用NF变量一样使用NR来只打印某些输入行:

(NR < 10 ) || (NR > 100) { print "We are on record number 1-9 or 101+" } 

awk命令详解(一)相关推荐

  1. linux awk命令详解,使用system来内嵌系统命令,批量github,批量批下载视频, awk合并两列...

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  2. shell awk命令详解

    shell awk命令详解 awk原理 格式 实操 相关内建变量 简易需求 进阶操作 高阶操作 awk原理 逐行读取文本,默认时以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中, ...

  3. 深度学企业linux awk命令详解与应用(下篇)

    开篇语: 我们在<一篇速学企业linux awk命令详解与应用(上篇)>中介绍了 awk 的基本用法,其实在awk 脚本程序中,还支持使用一些编程语言,比如变量.数组.分支结构(if-th ...

  4. linux awk命令根据分隔符输出,Linux运维知识之Linux awk命令详解

    本文主要向大家介绍了Linux运维知识之Linux awk命令详解,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. awk :适用程序,一种unix工具 就是一个强大的文本分析工 ...

  5. linux下awk命令详解,Linux文件处理awk命令-linux awk命令详解-嗨客网

    Linux文件处理awk命令详解教程 Linux awk命令说明 awk 是一个强大的文本分析工具,相对于 awk 有 3 个不同版本: awk.nawk 和 gawk,未作特别说明,一般指 gawk ...

  6. linux三剑客之awk命令详解

    linux三剑客之awk命令详解 awk 是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件.数据排序.计算以及生成报表等等.awk工具主要用于格式化输出,可以用类似于处理表格的方式处理文 ...

  7. Linux awk命令详解

    awk 是除了 sed 命令之外,Linux 系统中另一个功能比较强大的数据处理工具.下面良许小编就将从几个方面对于 Linux awk命令详解命令进行详述,希望对大家有所帮助. 和 sed 命令类似 ...

  8. awk命令详解【非常实用】

    shell三剑客:grep.sed.awk cut -c:字符数来截取 character -f:字段来截取 field -d:指定分隔符 默认是tab awk命令详解 awk其实可以看做一种编程语言 ...

  9. Liunx awk命令详解

    Liunx awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  10. awk if 不包含_linux高级运维必会命令——AWK命令详解及实例分享

    一.awk简介 awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK 的确拥有自己的语言: AWK ...

最新文章

  1. Codeforces Round #165 (Div. 2) A - Fancy Fence
  2. 通过COS上传文件至腾讯云
  3. 码云一个仓库只有一个项目吗_gitee码云完整使用教程(部署与克隆)
  4. 360安全卫士 导致MySQL 5.0.24 自动关闭
  5. java获取当前时间星期几_java怎么获取当前日期是星期几
  6. python是开源语言吗c,属于新十年的开发语言:Go语言可能很快会取代Python
  7. python 使用lxml中的xpath 和 scrpay中的xpath的区别
  8. linux怎么打开rdp文件,RDP报表工具如何在Linux机器上部署?
  9. 矢量地图自定义切片样式
  10. BP神经网络算法简介
  11. 虚拟打印机 服务器,cimfax64位系统虚拟打印机安装.pdf
  12. 25 个很棒的 Python 脚本合集(迷你项目) - PDF 下载
  13. 修复计算机命令行,命令提示符修复系统方法
  14. 高集成AX6800x USB KVM多电脑切换器单片机解决方案介绍视频
  15. java 使用poi将PPT转为图片,在线预览PPT
  16. 用meta name=renderer content=webkit|ie-comp|ie-stand来切换360双核安全浏览器的极速模式和兼容模式
  17. 如果我写一个开源的HIS软件
  18. Lambda相关图形
  19. 微信公众号开发之语音消息识别
  20. AceAdmin-v1.4.0 下载

热门文章

  1. 微信小程序开发之选项卡(窗口顶部TabBar)页面切换
  2. 无法重新启动计算机进入恢复环境,win10系统出现电脑一直重新启动的有效解决方法...
  3. mysql com_select_mysql学习一之SELECT语句
  4. PHP+MySQL图书商城管理系统
  5. linux脚本批量加注释,shell中如何批量注释和取消注释
  6. vscode自定义代码块
  7. 如何解析json并展示到html页面中,js解析json并生成html页面
  8. 华为mate30是安卓系统还是鸿蒙系统,鸿蒙系统将搭载在华为mate30上,仅国内发布,是取代安卓的节奏?...
  9. 用U盘装机大师安装GHOST WIN8系统前准备
  10. 网曝饮料瓶瓶口不卫生 记者实验墨水能够渗入