Linux的AWK命令--Linux和Unix的使用语法示例

140 阅读4分钟

在这个适合初学者的指南中,你将学习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有各种各样的学习材料可供选择。

这里有几个可以让你开始:

谢谢你的阅读,祝你学习愉快 😊