Linux的Awk命令你知多少?

日期: 2015-10-07 作者:Rob Reilly翻译:杨旭 来源:TechTarget中国 英文

Awk是一种可以对文本和数据进行处理的编程语言,1977年由Alfred Aho、Peter Weinberger和Brian Kernighan开发而来。Awk的名字是由三位开发者的姓氏首字母构成。Awk的各种变形(nawk和gawk等等)几乎支持所有的Linux版本,并且可以简单地从命令行使用。作为一个强大的命令行工具也意味着awk对于Secure Shell也是有效的。

该编程语言用于处理文本文件。默认情况下,文件的每一行都被视为一个记录。然后记录进一步分解成一系列的字段。Awk程序就是一系列作用在记录和字段上的“识别-执行”操作语句。

Awk以顺序方式阅读文件,当响应特定模式时,会提示相……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

Awk是一种可以对文本和数据进行处理的编程语言,1977年由Alfred Aho、Peter Weinberger和Brian Kernighan开发而来。Awk的名字是由三位开发者的姓氏首字母构成。Awk的各种变形(nawk和gawk等等)几乎支持所有的Linux版本,并且可以简单地从命令行使用。作为一个强大的命令行工具也意味着awk对于Secure Shell也是有效的。

该编程语言用于处理文本文件。默认情况下,文件的每一行都被视为一个记录。然后记录进一步分解成一系列的字段。Awk程序就是一系列作用在记录和字段上的“识别-执行”操作语句。Awk以顺序方式阅读文件,当响应特定模式时,会提示相关动作。

使用awk命令进行模式匹配

举个栗子,假设我想打印一个文件中的所有与特定字符串匹配的行。

首先,我需要有一个文本文件。可以使用ls命令及选项获得本地文件目录清单。下面的命令行运行ls时用到了-l(长度)和-h(打印千字节或字节)参数,并且重定向输出到一个名为rob-list.txt的文本文件。

ls -lh > rob-list.txt

rob-list.txt中的运行结果如下:

total 40K

-rw-rw-r-- 1 rob rob 23K Jul 12 15:29 awk-basics.odt

-rw-rw-r-- 1 rob rob 110 Jul  7 12:52 rob2.data

-rw-rw-r-- 1 rob rob 220 Jul 12 16:26 rob3.data

-rwxrwxrwx 1 rob rob  59 Jul 12 16:28 rob.awk

-rw-rw-r-- 1 rob rob 220 Jun 27 10:55 rob.data

-rw-rw-r-- 1 rob rob   0 Jul 12 16:57 rob-list.txt

使用awk命令找到“220”:

awk '/220/ {print $0}' rob-list.txt

结果如下:

-rw-rw-r-- 1 rob rob 220 Jul 12 16:26 rob3.data

-rw-rw-r-- 1 rob rob 220 Jun 27 10:55 rob.data

在这种情况下,awk将斜杠之间的文本从文件开始匹配一直到结束。$0代表整行,而且你只能打印每一行的特定字段。

如果你只想打印文件大小和文件名,你可以这样做:将文本文件的文件大小定为5,文件的名字是9。空白是默认字段分隔符。下面这个awk命令行将只显示文件大小和文件名称:

awk '{print $5 " " $9}' rob-list.txt

结果将如下所示:

23K awk-basics.odt

110 rob2.data

220 rob3.data

59 rob.awk

220 rob.data

0 rob-list.txt

如果你想在电脑屏幕上看到实际命令行上的内容,在打印输出前会有一个空行,这是因为awk只会打印5和9字段,即使是空行。

更多组合

你可以将某些匹配进行组合。再举个例子,如果你想找到包含字符串“220”的行并打印出文件大小和名称,命令可以如下:

awk '/220/ {print $5 " " $9}' rob-list.txt

输出如下:

220 rob3.data

220 rob.data

请注意,当你使用匹配选项 '/ 目标字符串 /' 时,awk命令将对文本文件的每一行进行字符串匹配。不难想象,除了打印出来的字段,其他字段也有可能包含220字符串。在这种情况下,即使文件大小字段(第5字段)中不包含220,匹配结果仍然会显示出来。

显然,这些例子适合非常小的文本文件。Awk可以处理更大的文件,比如数万甚至数十万行文本。Awk只是通过有条不紊的步骤从开头一直检查到最后,进行匹配并打印和输出结果。

当然,你也可以使用一些更先进的方法。例如,你想搜索一些满足特定条件的行并且只打印这些:

awk '(index($9, "rob") != 0) && (index($9, "awk") !=0) {print $5" "$9}' rob-list.txt

结果如下:

59 rob.awk

这里是在rob-list.txt中找出“rob”和“awk”实例。在这种情况下,我用&&  (and) 操作符只打印出两行。你还可以使用 || 运算符做“or”比较。

当查找特定字符串时,你也可以用数字表示。和上面的awk命令稍有不同,输出结果中可以用“I found it”代替“rob”和“awk”。例如:

awk '(index($9, "rob") != 0) && (index($9, "awk") !=0) {print $5" I found it"}' rob-list.txt

输入结果如下:

59 I found it

将awk投入到实际工作中

在一些物联网项目中,需要在平台和应用程序之间移动数据,这时我会用到awk。例如,我已经将DS18B20数字温度传感器的数据通过Arduino运行,将文本数据通过XBee radios输出到Linux笔记本。使用cat命令查询USB接口将数据传输到笔记本,然后重定向到一个文本文件。

cat /dev/ttyUSB0 > rob.data

这里有一些Arduino数据:

a001|83.52|a002|92.11

a001|83.52|a002|92.31

a001|83.52|a002|94.36

a001|83.52|a002|93.92

a001|83.64|a002|93.50

a001|83.64|a002|93.12

a001|83.64|a002|92.91

a001|83.64|a002|92.85

a001|83.52|a002|92.43

a001|83.64|a002|92.17

这些数据代表两个不同的传感器“a001”和“a002”上的每秒温度读数。我用awk进行独立阅读,并把它们放在Linux笔记本上kst绘图工具里。

我用下面的awk命令为kst绘图工具准备数据。

awk -F "|" '{print $3","$4}' < rob.data > rob2.data

数据输出现在只有X和Y坐标,中间由一个逗号分开,符合kst显示

a002,92.11

a002,92.31

a002,94.36

a002,93.92

a002,93.50

a002,93.12

a002,92.91

a002,92.85

a002,92.43

a002,92.17

请注意,你只需添加字符、空格等等就可以巧妙地改变输出的格式。Awk可以理想地完成数据格式转换工作。

作者

Rob Reilly
Rob Reilly

Rob Reilly,独立作家,发表大量分析和指南类文章,内容涵盖Linux和开源、物联网等。

相关推荐

  • 你真的了解Linux命令吗?

    你觉得在网络管理和服务器管理方面对Linux命令的使用已经是专家级别了?去试试这些Linux命令测验来看看你对10个Linux工具的了解程度以及他们的使用案例吧。

  • 六大Linux命令诊断网络连通性

    有不少可用的Linux工具可以协助诊断网络连接失败的情况。下面将介绍故障发生时六个最常用的命令。

  • 九大基础Linux命令 你get了么?

    作为系统管理员必须熟练掌握Linux命令。Linux命令的内容很多,比如Kill命令、lsof命令对于实现对服务器和数据中心的即时管理具有很重要的意义。

  • Linux服务器管理员必备Linux命令TOP5

    作为系统管理员必须熟练掌握Linux命令。Linux命令的内容很多,其中的一些TOP命令对于实现对服务器和数据中心的即时管理具有很重要的意义。