在这个适合初学者的指南中,你将学习awk 命令的基本知识。你还会看到在处理文本时可以使用它的一些方法。
让我们开始吧!
什么是awk 命令?
awk 是一种脚本语言,它在命令行中工作时很有帮助。它也是一个广泛用于文本处理的命令。
当使用awk ,你能够根据你提供的模式来选择数据--一个或多个单独的文本片段。
例如,你可以用awk 进行的一些操作是在给定的一段文本中搜索一个特定的词或模式,甚至可以在你提供的文件中选择某一行或某一列。
awk 命令的基本语法
在其最简单的形式中,awk 命令后面是一组单引号和一组大括号,最后提到你要搜索的文件的名称。
它看起来像这样:
awk '{action}' your_file_name.txt
当你想搜索具有特定模式的文本,或者你想在文本中寻找一个特定的词,该命令看起来像这样:
awk '/regex pattern/{action}' your_file_name.txt
如何创建一个样本文件
要在命令行中创建一个文件,你可以使用touch 命令。
例如:touch filename.txt 其中filename ,是你的文件名称。
然后你可以使用open 命令(open filename.txt),一个像TextEdit这样的文字处理程序就会打开,你可以在其中添加文件的内容。
因此,假设你有一个文本文件,information.txt ,其中包含分隔成不同栏目的数据。
该文件的内容可以是这样的:
fristName lastName age city ID
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Wood Tinker 54 Lisbon N/A
Giorgos Georgiou 35 London 300
Timmy Turner 32 Berlin N/A
在我的例子中,firstName,lastName,age,city, 和ID 都有一列。
在任何时候,你都可以通过输入cat text_file ,查看文件内容的输出,其中text_file 是你的文件名称。
如何使用打印文件的所有内容awk
要打印一个文件的所有内容,你在大括号内指定的操作是print $0 。
这将与前面提到的cat 命令的工作方式完全相同:
awk '{print $0}' information.txt
Ouptut:
fristName lastName age city ID
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Wood Tinker 54 Lisbon N/A
Giorgos Georgiou 35 London 300
Timmy Turner 32 Berlin N/A
如果你想让每一行都有一个行数,你可以使用NR 这个内置变量:
awk '{print NR,$0}' information.txt
1 fristName lastName age city ID
2
3 Thomas Shelby 30 Rio 400
4 Omega Night 45 Ontario 600
5 Wood Tinker 54 Lisbon N/A
6 Giorgos Georgiou 35 London 300
7 Timmy Turner 32 Berlin N/A
如何使用 "打印特定的列"?awk
当使用awk ,你可以指定你想要打印的某些列。
要打印第一列,你可以使用以下命令:
awk '{print $1}' information.txt
Ouput:
Thomas
Omega
Wood
Giorgos
Timmy
$1 代表第一个字段,在这里是指第一列。
要打印第二列,你可以使用$2 :
awk '{print $2}' information.txt
输出:
lastName
Shelby
Night
Tinker
Georgiou
Turner
awk 确定每一列开始和结束的方式是默认使用空格。
要打印多于一列,例如第一列和第四列,你应该这样做:
awk '{print $1, $4}' information.txt
Ouput:
fristName city
Thomas Rio
Omega Ontario
Wood Lisbon
Giorgos London
Timmy Berlin
$1 代表第一个输入字段(第一列),而$4 代表第四列。你用逗号把它们分开,$1,$4 ,这样输出就有一个空格,更容易阅读。
要打印最后一个字段(最后一列),你也可以使用$NF ,代表记录中的最后一个字段。
awk '{print $NF}' information.txt
输出:
ID
400
600
N/A
300
N/A
如何打印某一列的特定行
你也可以指定你想从你选择的列中打印的行:
awk '{print $1}' information.txt | head -1
Ouput:
FirstName
让我们把这个命令分解一下。awk '{print $1}' information.txt ,打印第一列。然后,该命令的输出(你在前面看到的)通过管道符号| ,被输送到head命令,其参数-1 ,选择该列的第一行。
如果你想打印两行,你会这样做:
awk '{print $1}' information.txt | head -2
输出:
FirstName
Dionysia
如何打印出具有特定模式的行?awk
你可以打印以特定字母开头的行。
比如说:
awk '/^O/' information.txt
输出:
Omega Night 45 Ontario 600
该命令可以选择任何以O开始的文本行。
你首先使用向上的箭头符号(^),它表示一行的开始,然后是你想让一行以哪个字母开始。
你也可以打印以特定模式结束的一行:
awk '/0$/' information.txt
输出:
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Giorgos Georgiou 35 London 300
这将打印出以0 结尾的行--$ 符号用在一个字符之后,以说明一行将如何结束。
这条命令也可以改成:
awk '! /0$/' information.txt
! 是作为NOT 使用的,所以在这种情况下,它选择的是不以0 结尾的行:
fristName lastName age city ID
Wood Tinker 54 Lisbon N/A
Timmy Turner 32 Berlin N/A
如何使用正则表达式在awk
要输出包含某些字母的单词,并打印出与你指定的模式相匹配的单词,你可以再次使用前面显示的斜线,// 。
如果你想寻找包含on 的单词,你可以这样做:
awk ' /io/{print $0}' information.txt
输出:
Thomas Shelby 30 Rio 400
Omega Night 45 Ontario 600
Giorgos Georgiou 35 London 300
这将匹配所有包含io 的条目。
假设你有一个额外的列--department 列:
fristName lastName age city ID department
Thomas Shelby 30 Rio 400 IT
Omega Night 45 Ontario 600 Design
Wood Tinker 54 Lisbon N/A IT
Giorgos Georgiou 35 London 300 Data
Timmy Turner 32 Berlin N/A Engineering
要想找到所有在IT 中工作的人的信息,你需要在斜杠之间加上你要搜索的字符串,// :
awk '/IT/' information.txt
输出:
Thomas Shelby 30 Rio 400 IT
Wood Tinker 54 Lisbon N/A IT
如果你只想看到在IT 中工作的人的名字和姓氏呢?
你可以这样指定这一栏:
awk '/IT/{print $1, $2}' information.txt
输出:
Thomas Shelby
Wood Tinker
这将只显示出现IT 的第一和第二列,而不是呈现所有字段。
当搜索具有特定模式的单词时,有时你可能需要使用转义字符,如这样:
awk '/N\/A$/' information.txt
输出:
Wood Tinker 54 Lisbon N/A
Timmy Turner 32 Berlin N/A
我想找到以图案N/A 结尾的行。
因此,当像目前显示的那样在' // ' 之间搜索时,我必须在N/A 之间使用转义字符(\),否则我将得到一个错误。
如何使用比较运算符在awk
例如,如果你想找到所有年龄在40 以下的员工信息,你可以这样使用< 比较运算符:
awk '$3 < 40 { print $0 }' information.txt
输出:
Thomas Shelby 30 Rio 400
Giorgos Georgiou 35 London 300
Timmy Turner 32 Berlin N/A
输出结果只显示40岁以下的人的信息。
结语
就这样,你已经掌握了!你现在知道了开始使用awk 和操作文本数据的绝对基础知识。
要学习更多关于Linux的知识,freeCodeCamp有各种各样的学习材料可供选择。
这里有几个可以让你开始:
谢谢你的阅读,祝你学习愉快 😊