awk 入门:强大的文本解析工具

让我们开始深入使用它。
125 位读者喜欢这篇文章。
Woman programming

WOCinTech Chat。由 Opensource.com 修改。CC BY-SA 4.0

Awk 是一个用于 Unix 和类 Unix 系统的强大文本解析工具,但因为它具有可用于执行常见解析任务的编程函数,所以也被认为是一种编程语言。您可能不会使用 awk 开发下一个 GUI 应用程序,它可能也不会取代您的默认脚本语言,但对于特定任务来说,它是一个强大的实用程序。

这些任务可能非常多样化。发现哪些问题最适合用 awk 解决的最佳方法是学习 awk;您会惊讶于 awk 如何帮助您事半功倍。

Awk 的基本语法是

awk [options] 'pattern {action}' file

要开始使用,请创建此示例文件并将其另存为 colours.txt

name       color  amount
apple      red    4
banana     yellow 6
strawberry red    3
grape      purple 10
apple      green  8
plum       purple 2
kiwi       brown  4
potato     brown  9
pineapple  yellow 5

此数据按一个或多个空格分隔成列。您要分析的数据通常以某种方式组织。它可能并不总是由空格分隔的列,甚至不是逗号或分号,但尤其是在日志文件或数据转储中,通常存在可预测的模式。您可以使用数据模式来帮助 awk 提取和处理您要关注的数据。

打印列

在 awk 中,print 函数显示您指定的任何内容。有许多预定义的变量可以使用,但一些最常见的是指定文本文件中列的整数。试用一下

$ awk '{print $2;}' colours.txt
color
red
yellow
red
purple
green
purple
brown
brown
yellow

在本例中,awk 显示第二列,用 $2 表示。这相对直观,因此您可能可以猜到 print $1 显示第一列,print $3 显示第三列,依此类推。

要显示所有列,请使用 $0

美元符号 ($) 后的数字是一个表达式,因此 $2$(1+1) 含义相同。

有条件地选择列

您正在使用的示例文件结构非常清晰。它有一行作为标题,列与列之间直接相关。通过定义条件要求,您可以限定在查看此数据时希望 awk 返回的内容。例如,要查看第 2 列中与“yellow”匹配的项目,并打印第 1 列的内容

awk '$2=="yellow"{print $1}' colours.txt
banana
pineapple

正则表达式也适用。此条件查看 $2 中是否近似匹配字母 p,后跟任意数量(一个或多个)字符,然后是字母 p

$ awk '$2 ~ /p.+p/ {print $0}' colours.txt
grape   purple  10
plum    purple  2

数字由 awk 自然地解释。例如,要打印第三列包含大于 5 的整数的任何行

awk '$3>5 {print $1, $2}' colours.txt
name    color
banana  yellow
grape   purple
apple   green
potato  brown

字段分隔符

默认情况下,awk 使用空格作为字段分隔符。并非所有文本文件都使用空格来定义字段。例如,创建一个名为 colours.csv 的文件,内容如下

name,color,amount
apple,red,4
banana,yellow,6
strawberry,red,3
grape,purple,10
apple,green,8
plum,purple,2
kiwi,brown,4
potato,brown,9
pineapple,yellow,5

只要您在命令中指定应使用哪个字符作为字段分隔符,Awk 就可以完全相同的方式处理数据。使用 --field-separator (或简写为 -F)选项来定义分隔符

$ awk -F"," '$2=="yellow" {print $1}' file1.csv
banana
pineapple

保存输出

使用输出重定向,您可以将结果写入文件。例如

$ awk -F, '$3>5 {print $1, $2} colours.csv > output.txt

这将创建一个包含 awk 查询内容的文件。

您还可以将文件拆分为多个文件,按列数据分组。例如,如果您想根据每行中出现的颜色将 colours.txt 拆分为多个文件,您可以使 awk 通过在 awk 语句中包含重定向来按查询重定向

$ awk '{print > $2".txt"}' colours.txt

这将生成名为 yellow.txtred.txt 等文件。

在下一篇文章中,您将了解更多关于字段、记录和一些强大的 awk 变量的信息。


本文改编自 Hacker Public Radio 的一集,这是一个社区技术播客。

接下来阅读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,并且经常同时从事这两项工作。
User profile image.
Dave Morriss 是一位退休的 IT 经理,居住在苏格兰爱丁堡。他曾在英国高等教育部门工作,为学生和教职员工提供 IT 服务。

4 条评论

关于一个很棒的工具的非常好的文章。

PS. UNIX 的美妙之处 --> tr -s '[:blank:]' ',' < colours.txt > colours.csv

谢谢!是的,不仅仅是 UNIX 的美妙之处 - UNIX *单行命令* 的美妙之处。太棒了!

回复 作者 anestis

谢谢你的精彩文章!

一个小小的更正

`awk '$2=="yellow"{print $1}' file1.txt`

应该是

`awk '$2=="yellow"{print $1}' colours.txt`

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.