Awk是一种可以对文本和数据进行处理的编程语言,1977年由Alfred Aho、Peter Weinberger和Brian Kernighan开发而来。Awk的名字是由三位开发者的姓氏首字母构成。Awk的各种变形(nawk和gawk等等)几乎支持所有的Linux版本,并且可以简单地从命令行使用。作为一个强大的命令行工具也意味着awk对于Secure Shell也是有效的。
该编程语言用于处理文本文件。默认情况下,文件的每一行都被视为一个记录。然后记录进一步分解成一系列的字段。Awk程序就是一系列作用在记录和字段上的“识别-执行”操作语句。
Awk以顺序方式阅读文件,当响应特定模式时,会提示相……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属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可以理想地完成数据格式转换工作。
相关推荐
-
你真的了解Linux命令吗?
你觉得在网络管理和服务器管理方面对Linux命令的使用已经是专家级别了?去试试这些Linux命令测验来看看你对10个Linux工具的了解程度以及他们的使用案例吧。
-
六大Linux命令诊断网络连通性
有不少可用的Linux工具可以协助诊断网络连接失败的情况。下面将介绍故障发生时六个最常用的命令。
-
九大基础Linux命令 你get了么?
作为系统管理员必须熟练掌握Linux命令。Linux命令的内容很多,比如Kill命令、lsof命令对于实现对服务器和数据中心的即时管理具有很重要的意义。
-
Linux服务器管理员必备Linux命令TOP5
作为系统管理员必须熟练掌握Linux命令。Linux命令的内容很多,其中的一些TOP命令对于实现对服务器和数据中心的即时管理具有很重要的意义。