热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

awkbc命令linux_在Linux系统中Awk编程语言的基本知识及使用Awk命令的示例

本文介绍在Linux系统中使用Awk命令的示例,及掌握Awk编程语言的基本知识,这将大大提高您在命令行上操作文本文件的能力。Awk是一种用于高级文本处理

本文介绍在Linux系统中使用Awk命令的示例,及掌握Awk编程语言的基本知识,这将大大提高您在命令行上操作文本文件的能力。Awk是一种用于高级文本处理的通用脚本语言,它主要用作报告和分析工具。与大多数其他程序性编程语言不同,Awk是数据驱动的,这意味着您定义了一组针对输入文本要执行的操作,它获取输入数据,对其进行转换,然后将结果发送到标准输出。可参考在Fedora系统下使用Awk的方法。

35e9a75f90e6ebd8a9b381e3454a4156.png

awk如何运作

awk有几种不同的实现,我们将使用awk的GNU实现,称为gawk,在大多数Linux系统上,awk解释器只是与gawk的符号链接。

1、记录和字段

Awk处理来自文件或流的文本数据,输入数据分为记录和字段,Awk一次对一条记录进行操作,直到达到输入结束为止。记录由称为记录分隔符的字符分隔,默认的记录分隔符是换行符,这意味着文本数据中的每一行都是一条记录,可以使用RS变量设置新的记录分隔符。

记录包含由字段分隔符分隔的字段,默认情况下,字段之间用空格分隔,包括一个或多个制表符、空格和换行符。

每个记录中的字段均以美元符号($)开头,后跟字段编号,以1开头。第一个字段以$1表示,第二个字段以$2表示,依此类推,最后一个字段也可以用特殊变量$NF引用,整个记录可以用$0引用。

这是显示如何引用记录和字段的直观表示:

a1afd527055e42702c1494797b0b1c49.png

2、AWK程序

要使用awk处理文本,您需要编写一个程序来告诉命令该做什么,该程序由一系列规则和用户定义的功能组成,每个规则包含一个模式和一个动作对,规则以换行符或分号(;)分隔,通常,awk程序如下所示:

pattern { action }

pattern { action }

...

当awk处理数据时,如果模式与记录匹配,它将在该记录上执行指定的操作,当规则没有模式时,将匹配所有记录(lines)。

awk操作用大括号({})括起来,并由多个语句组成,每个语句指定要执行的操作,一个动作可以有多个语句,用换行符或分号(;)分隔,如果规则不起作用,则默认为打印整个记录。

Awk支持不同类型的语句,包括表达式、条件、输入、输出语句等,最常见的awk语句是:

exit-停止执行整个程序并退出。

next-停止处理当前记录,并移至输入数据中的下一个记录。

print-打印记录、字段、变量和自定义文本。

printf-使您可以更好地控制输出格式,类似于C和bash printf。

编写awk程序时,井号(#)之后直到该行末尾的所有内容均被视为注释,可以使用连字符反斜杠(\)将长行分成多行。

3、执行awk程序

awk程序可以通过多种方式运行,如果程序简短而简单,则可以将其直接通过命令行传递给awk解释器:

awk 'program' input-file...

在命令行上运行程序时,应将其括在单引号('')中,以便Shell程序不解释程序。

如果程序又大又复杂,则最好将其放在文件中,并使用-f选项将文件传递给awk命令:

awk -f program-file input-file...

在下面的示例中,我们将使用一个名为“teams.txt”的文件,该文件如下所示:

e6dcc3f0a57a8760e4a1ab78731bb14c.png

Awk模式

awk中的模式控制是否应该执行关联的动作。

Awk支持不同类型的模式,包括正则表达式、关系表达式、范围和特殊表达式模式。

当规则没有模式时,将匹配每个输入记录,这是仅包含操作的规则的示例:

awk '{ print $3 }' teams.txt

该程序将打印每个记录的第三个字段:

60

58

51

49

48

1、正则表达式模式

正则表达式或正则表达式是与一组字符串匹配的模式,Awk正则表达式模式包含在斜杠(//)中:

/regex pattern/ { action }

最基本的示例是文字字符或字符串匹配,例如,要显示每个包含“0.5”的记录的第一个字段,您可以运行以下命令:

awk '/0.5/ { print $1 }' teams.txt

返回:

Celtics

Pacers

模式可以是任何类型的扩展正则表达式,这是一个示例,如果记录以两个或多个数字开头,则打印第一个字段:

awk '/^[0-9][0-9]/ { print $1 }' teams.txt

返回:

76ers

2、关系表达模式

关系表达式模式通常用于匹配特定字段或变量的内容。

默认情况下,正则表达式模式与记录匹配,要将正则表达式与字段进行匹配,请指定该字段,然后对模式使用“contain”比较运算符(~)。

例如,要打印每个记录的第二字段包含“ia”的第一字段,请输入:

awk '$2 ~ /ia/ { print $1 }' teams.txt

返回:

76ers

Pacers

要匹配不包含给定模式的字段,请使用!~运算符:

awk '$2 !~ /ia/ { print $1 }' teams.txt

返回:

Bucks

Raptors

Celtics

您可以比较字符串或数字之间的关系,例如,大于、小于、等于等。以下命令将打印所有第三字段大于50的记录的第一字段:

awk '$3 > 50 { print $1 }' teams.txt

返回:

Bucks

Raptors

76ers

3、范围模式

范围模式由用逗号分隔的两个模式组成:

pattern1, pattern2

从匹配第一个模式的记录开始的所有记录,直到匹配第二个模式的记录为止。

这是一个示例,它将打印所有记录的第一个字段,从包含“Raptors”的记录开始,直到包含“Celtics”的记录:

awk '/Raptors/,/Celtics/ { print $1 }' teams.txt

返回:

Raptors

76ers

Celtics

模式也可以是关系表达式,下面的命令将打印所有记录,从第四个字段等于32的记录开始,直到第四个字段等于33的记录:

awk '$4 == 31, $4 == 33 { print $0 }' teams.txt

返回:

07856cadd879c5114bb721f0a88a1967.png

范围模式不能与其他模式表达式结合使用。

4、特殊表达方式

Awk包括以下特殊模式:

BEGIN-用于在处理记录之前执行操作。

END-用于在处理记录后执行操作。

BEGIN模式通常用于设置变量,而END模式则用于处理来自记录(例如计算)的数据。

以下示例将打印“Start Processing.”,然后打印每个记录的第三个字段,最后打印“End Processing.”:

awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt

返回:

Start Processing

60

58

51

49

48

End Processing.

如果程序仅具有BEGIN模式,则将执行操作并且不处理输入,如果程序只有END模式,则在执行规则操作之前先处理输入。

GNU版本的awk还包括另外两个特殊模式BEGINFILE和ENDFILE,它们使您可以在处理文件时执行操作。

5、组合模式

Awk允许您使用逻辑AND运算符(&&)和逻辑OR运算符(||)组合两个或多个模式。

这是一个使用&&运算符来打印第三字段大于50而第四字段小于30的记录的第一字段的示例:

awk &#39;$3 > 50 && $4 <30 { print $1 }&#39; teams.txt

返回&#xff1a;

d7759a3082e081c3423a361768cb55e4.png

内置变量

Awk具有许多内置变量&#xff0c;这些变量包含有用的信息&#xff0c;并允许您控制程序的处理方式&#xff0c;以下是一些最常见的内置变量&#xff1a;

NF-记录中的字段数。

NR-当前记录的编号。

FILENAME-当前正在处理的输入文件的名称。

FS-字段分隔符。

RS-记录分隔符。

OFS-输出字段分隔符。

ORS-输出记录分隔符。

这是显示如何打印文件名和行数(记录)的示例&#xff1a;

awk &#39;END { print "File", FILENAME, "contains", NR, "lines." }&#39; teams.txt

返回&#xff1a;

File teams.txt contains 5 lines.

AWK中的变量可以在程序的任何行中设置。要为整个程序定义变量&#xff0c;应以BEGIN模式设置。

更改字段和记录分隔符

字段分隔符的默认值是任意数量的空格或制表符&#xff0c;可以通过设置FS变量来更改。

例如&#xff0c;将字段分隔符设置为&#xff0c;您将使用&#xff1a;

awk &#39;BEGIN { FS &#61; "." } { print $1 }&#39; teams.txt

返回&#xff1a;

f419aeb19c710c1003d3d202aa884f85.png

字段分隔符也可以设置为多个字符&#xff1a;

awk &#39;BEGIN { FS &#61; ".." } { print $1 }&#39; teams.txt

在命令行上运行awk单线时&#xff0c;还可以使用-F选项来更改字段分隔符&#xff1a;

awk -F "." &#39;{ print $1 }&#39; teams.txt

默认情况下&#xff0c;记录分隔符是换行符&#xff0c;可以使用RS变量进行更改。

这是显示如何将记录分隔符更改为.的示例&#xff1a;

awk &#39;BEGIN { RS &#61; "." } { print $1 }&#39; teams.txt

返回&#xff1a;

288e690d21944ddc16cd2fe1ade000dc.png

Awk动作

Awk操作用大括号({})括起来&#xff0c;并在模式匹配时执行&#xff0c;一个动作可以有零个或多个语句&#xff0c;多个语句按照它们出现的顺序执行&#xff0c;并且必须用换行符或分号(;)分隔。

awk支持多种类型的动作语句&#xff1a;

表达式&#xff0c;例如变量赋值、算术运算符、递增和递减运算符。

控制语句&#xff0c;用于控制程序的流程(if、for、while、switch和more)。

输出语句&#xff0c;例如print和printf。

复合语句&#xff0c;将其他语句分组。

输入语句&#xff0c;以控制输入的处理。

删除语句&#xff0c;删除数组元素。

打印语句可能是最常用的awk语句&#xff0c;它打印文本、记录、字段和变量的格式化输出。

打印多个项目时&#xff0c;需要用逗号分隔&#xff0c;这是一个例子&#xff1a;

awk &#39;{ print $1, $3, $5 }&#39; teams.txt

打印的项目由单个空格分隔&#xff1a;

9cb62a0c4b64e879715d8547a1cda8e1.png

如果您不使用逗号&#xff0c;则项目之间将没有空格&#xff1a;

awk &#39;{ print $1 $3 $5 }&#39; teams.txt

这些项目是串联的&#xff1a;

5a62e0a43884a8bdd0a1cbbb1d84170b.png

当使用不带参数的print时&#xff0c;默认情况下打印$0&#xff0c;当前记录被打印。

要打印自定义文本&#xff0c;必须用双引号引起来的文本&#xff1a;

awk &#39;{ print "The first field:", $1}&#39; teams.txt

返回&#xff1a;

cefa07009d835902830032e7b82cd58f.png

您还可以打印特殊字符&#xff0c;例如换行符&#xff1a;

awk &#39;BEGIN { print "First line\nSecond line\nThird line" }&#39;

返回&#xff1a;

d172934b5c11fbaca434363b3c5d7239.png

printf语句使您可以更好地控制输出格式&#xff0c;这是一个插入行号的示例&#xff1a;

awk &#39;{ printf "%3d. %s\n", NR, $0 }&#39; teams.txt

printf不会在每条记录之后创建换行符&#xff0c;因此我们使用\n&#xff1a;

258ced7096d584f22d8f9e5cec8621b8.png

以下命令计算每行第三字段中存储的值的总和&#xff1a;

awk &#39;{ sum &#43;&#61; $3 } END { printf "%d\n", sum }&#39; teams.txt

返回&#xff1a;

266

这是另一个示例&#xff0c;显示了如何使用表达式和控制语句来打印从1到5的数字平方&#xff1a;

awk &#39;BEGIN { i &#61; 1; while (i <6) { print "Square of", i, "is", i*i; &#43;&#43;i } }&#39;

返回&#xff1a;

866b28b92cacd5fa444285e7b4f7dedc.png

单行命令(如上面的命令)较难理解和维护&#xff0c;编写更长的程序时&#xff0c;应创建一个单独的程序文件&#xff0c;名称prg.awk&#xff1a;

prg.awk

BEGIN {

i &#61; 1

while (i <6) {

print "Square of", i, "is", i*i;

&#43;&#43;i

}

}

通过将文件名传递给awk解释器来运行程序&#xff1a;

awk -f prg.awk

您还可以通过使用shebang指令并设置awk解释器将awk程序作为可执行文件运行&#xff1a;

#!/usr/bin/awk -f

BEGIN {

i &#61; 1

while (i <6) {

print "Square of", i, "is", i*i;

&#43;&#43;i

}

}

保存文件并使其可执行&#xff1a;

chmod &#43;x prg.awk

现在&#xff0c;您可以通过输入以下命令来运行程序&#xff1a;

./prg.awk

在Awk程序中使用Shell变量

如果您在Shell脚本中使用awk命令&#xff0c;则很可能需要将shell变量传递给awk程序&#xff0c;一种选择是用双引号而不是单引号将程序引起来&#xff0c;并在程序中替换变量&#xff0c;但是&#xff0c;此选项会使您的awk程序更加复杂&#xff0c;因为您需要对awk变量进行转义。

在awk程序中使用shell变量的推荐方法是将shell变量分配给awk变量&#xff0c;这是一个例子&#xff1a;

num&#61;51

awk -v n&#61;"$num" &#39;BEGIN {print n}&#39;

返回&#xff1a;

51

结语

Awk是用于文本操作的最强大的工具之一&#xff0c;以上示例的Awk命令使用也是较为基础的。

本文介绍的Awk编程语言基本知识对于您来说非常有用&#xff0c;因为掌握这些对于进阶Awk非常有好处&#xff0c;也是必不可少的。

相关主题



推荐阅读
  • 开发笔记:Squid代理服务
    本文由编程笔记#小编为大家整理,主要介绍了Squid代理服务相关的知识,希望对你有一定的参考价值。Squid服务基础缓存代理概述 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 通俗易懂玩QT:Qt 使用 QAxObject 类读写 Excel 文档(内附源码)
    Qt使用QAxObject类读写Excel文档因为工作需要,最近研究了一下使用Qt的QAxObject类实现对Excel文档的简单读写,查阅了很多资料 ... [详细]
author-avatar
爱看好电影110_275
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有