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

谢谢这篇好文章!

一个小小的更正

`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.