AWK用法全解

article/2025/9/22 12:52:55

一、awk介绍

awk是Linux自带的一个逐行扫描的文本处理工具,支持正则表达式、循环控制、条件判断、格式化输出。AWK自身带有一些变量,可以在书写脚本时调用。

二、基本语法格式

2.1、在shell中使用awk

awk [option] 代码块 文件名

  • option的选项及含义
选项含义使用演示演示说明
-F指定文件分隔符awk -F "\n"按\n做分隔符
-f使用文件中的内容作为命令输入awk -f  script.txt使用script.txt文件中的内容作为命令
-v给变量赋值,支持多个v赋值awk -v Num=$num -v Num1=$num1把num的值给Num、num1的值给Num1
  • 代码块的说明:

条件判断'{要执行的内容}'               注:条件判断与“{”之间不带空格,{}的两侧要使用单引号"'’"包围。

条件判断为真则执行{}中的内容,条件判断为假则不执行{}中的内容。

例如:

awk -F "," NR==2'{print $1}' awktest.txt   

#将awktest.txt文件中的文本以",",如果行号为2则打印第一列内容。

awk -F "," NR==10'{print "这是第"NR"行","第1列是:"$1,"第2列是:"$2}' awktest.txt

#打印多个列的字段、行号并于固定的字符串拼接

2.2、在脚本中使用awk代码

有些脚本命令比较长,在shell中编辑比较麻烦,这时考虑将命令写入脚本中方便保存和修改。

在脚本文件中,大致格式如下:

BEGIN{

语句一

语句二

}

表达式1 {要执行的内容}

表达式2 {要执行的内容}

END{

语句一

语句二

}

注意:{要执行的内容}中如果有多个语句要执行,使用","进行分割。在awk中,{}中的内容表示要执行的操作,赋值、判断等操作可以放在{}之外。

  • 创建一个文件awkScript.txt
vi awkScript.txt

以下脚本文件中的FS、NR是awk的自带变量,后面的内容中对此进行解释。 

#awk的脚本文件
#开始部分,一般用于脚本执行前的初始化,比如设置每一列的标题、设置分割符等等。
BEGIN{
FS=","
print "第一列","第二列"
}#这里是主要执行的代码块
{print "这是第"NR"行"}
NR%2 {print NR,"这是偶数行"}#END代码块。
END{
print "总计共有"NR"行"
print "脚本执行结束"
}
  • awk以脚本的方式执行这些文件
awk -f awkScript.txt awktest.txt

三、awk的内置变量

awk内置一些变量,这些变量可能会随着文本读取的进度发生变化,比如现在读取到第几行。我们可以调用这些内置变量。

变量名称说明使用示例示例说明
$number记录被分割后的第number列的字段,$表示整行文本。{print $1,$3}打印第1列和第3列字段
FS字段分割符(可使用FlieSplit记忆)BEGIN{FS="\n"}使用换行分割文本
NF当前行中的字段数量{print "当前行共有"NF"列"}打印当前行的列数
NR当前的行号(NnumberRow,从1开始)NR%2{print "这是偶数行"}判断是否是偶数行
RS表示记录分隔符,多行文本的情况下,RS字符将文本分割成几个大块(RowSplit)

BEGIN{

FS="\N"

RS=" "

}

对一个使用空行分割多个行的文本,RS表示的字符将文本分成多个段落,FS表示的字符将这些段落中的行分割成多个列。
OFS表示输出字段之间分隔符,将输出的多个字段使用OFS拼接,缺省为" "。(OutFileSpilt)

BEGIN{OFS=";"}

{print "字段1","字段2","字段3"}

输出的字段1、字段2、字段3变成"字段1;字段2;字段3"
ORS表示输出行之间记录分隔符,在两个单独行插入定义的字符串,缺省为"\n"

BEGIN{

ORS="\n\n"

}

输出的文本行之间有两个空行

四、awk的正则表达式

awk的正则表达式和其他语言的正则表达式规则一致

字符

描述

.

可代替除一行之外的任何单个字符

*

可代替零个或多个在它前面出现的字符

[chars]

可代替chars中的任何一个字符,chars是一串字符序列。你可以用-符号来定义一个字符范围。如果^是chars中的第一个字符,那么将匹配没有在chars中指定的字符

^

匹配一行的开头

$

匹配一行的结尾

\

把\后面的字符照常输出,通常用来转义(不使用特殊含义)一个元字符

!~匹配到的内容取反,表示不匹配
  • 在{}包裹的语句块之前使用正则表达式语法 

awk ‘/REG/{action}’        /REG/为要匹配的内容,{action}为匹配成功后要执行的动作。

#打印awktest.txt文件中包含2020年时间的行(使用"\"对/符号进行转义)

awk -F "," '/2020\/[0-9]{1,2}\/[0-9]{1,2}/{print $0}' awktest.txt

匹配到的结果为:

在{}代码块中使用正则表达式语法

awk -F "," '{if($0 ~ "2020/07/01"){print $0}else{print "none"}}' awktest.txt

五、awk控制流语句

5.1、条件语句

awkif语句类似于C语言的if语句

{ if ( $1 == "foo" ) { if ( $2 == "foo" ) { print "uno" } else { print "one" } } else if ($1 == "bar" ) { print "two" } else { print "three" } 
} 

5.2、循环语句

  • do...while循环
{ count=1 do { print "I get printed at least once no matter what" } while ( count != 1 ) 
} 
  • for循环
for ( x = 1; x <= 4; x++ ) { print "iteration",x 
} 
  • break和continue语句

如同C语言一样,awk提供了breakcontinue来控制awk的循环结构。break语句用于跳出最深层的循环,使循环立即终止,并继续执行循环代码块后面的语句。continue语句使awk立即开始执行下一个循环迭代,而不执行代码块的其余部分。

5.4、数组

awk中,数组下标通常从1开始,而不是0

myarray[1]="jim"
myarray[2]=456

 awk不需要连续的下标编号,例如,给myarray[1]赋值之后可以直接赋值myarrary[10]。

awk可以使用"in"操作来遍历数组中的所有元素,但这种遍历是无序的,无法保证按下标顺序输出。

for ( x in myarray ) { print myarray[x] 
} 

 awk数组中还可以使用字符串下标,其实,不管你使用的下标是字符串还是数字,awk在幕后还将其认为是字符串下标。

myarr["1"]="China" 
print myarr["1"] 
myarr["name"]="Mr. Whipple" 
print myarr["name"] 

六、awk的内置函数

awk并不像其他语言一样,把字符串看作是字符数组。执行以下代码:

mystring="How are you doing today?" 
print mystring[3] 

将会报错: 

 awk: string.gawk:59: fatal: attempt to use scalar as array

为了应对这种情况,awk内置了许多字符串函数。 

字符串函数功能说明使用示例示例说明
length()返回字符串的长度print length(mystring) 打印mystring字符串的长度
index()返回子字符串在另一个字符串中出现的位置print index(mystring,"you") 返回子字符串“you”在另一个mystring中出现的位置,如果没有找到该字符串则返回0
tolower()返回字符串并且将所有字符转换成小写print tolower(mystring) 把mystring所有的字母改成大写
toupper()返回字符串并且将所有字符转换成大写print toupper(mystring) 把mystring所有的字母改成小写
substr()返回从字符串中选择的子串awk '{print substr($0,2,10)}'打印字符串从第2位开始后面10个字符
match()返回子字符串在另一个字符串中出现的位置。它与index()的区别在于它并不搜索子串,它搜索的是正则表达式。match()还将设置两个变量,叫作RSTARTRLENGTHRSTART包含返回值(第一个匹配的位置),默认返回RESTART,RLENGTH指定它占据的字符跨度(如果没有找到匹配,则返回-1print match($0,/2020\/07\/01/),RLENGTH打印2020/07/01匹配到的起始位置和它的长度。
sub()替换匹配的第一个字符序列,并返回整个字符串sub(regexp,replstring,mystring) replstring替换在mystring中匹配regexp的第一个字符序列,sub()替换第一个regexp匹配
gsub()替换匹配的全部字符序列,并返回整个字符串gsub(regexp,replstring,mystring) replstring替换全部在mystring中匹配regexp的第一个字符序列
split()分割字符串,并将各部分放到使用整数下标的数组中num=split($0,var,",") {print var[1]}将当前行的文本以","分割,放进var数组中,打印第一各元素。num为接受分割后数组的长度。

七、awk的格式化输出

然大多数情况下awkprint语句可以完成任务,但有时我们还需要更多。使用两个函数printf()sprintf(),将能让输出锦上添花。printf()会将格式化字符串打印到stdout,而sprintf()则返回可以赋值给变量的格式化字符串。

x=1 
b="foo" 
printf("%s got a %d on the last test\n","Jim",83) 
myout=("%s-%d",b,x) 
print myout 

 


http://chatgpt.dhexx.cn/article/vlELfN55.shtml

相关文章

awk文本工具

awk 一、什么是awk&#xff1f;二、awk的工作原理三、命令格式四、管道符号调用四、getline 一、什么是awk&#xff1f; awk命令是一种编程语言&#xff0c;用于在linux/unix下对文本和数据进行处理。 而且它支持用户自定义函数和动态正则表达式等先进功能&#xff0c;是linux…

shell之三剑客awk(基础用法)

文章目录 一、awk概述1、awk工作原理 二、awk的格式三、内置变量演示1、【$n】进行演示2、【$0】的演示3、【NF】(多少列) 和 【NR】(多少行)的演示4、面试题5、BEGIN开始和END结尾6、模糊匹配7、关于数值与字符串的比较 四、总结 一、awk概述 AWK是一种处理文本文件的语言&am…

《J2EE 学习笔记 之 idea 搭建 SSM 项目》

J2EE 学习笔记 之 idea 搭建 SSM 项目 详细步骤 step1 step2 step3 step4 step5

对于J2EE体系架构的理解

一、何为J2EE&#xff1f; J2EE架构是使用Java技术开发企业级应用的一种事实上的工业标准&#xff0c;它是Java技术不断适应和促进企业级应用过程中的产物。Java平台有三个版本&#xff1a;适用于小型设备和智能卡的J2ME(Java 2 Platform Micro Edition)、适用于桌面系统的J2S…

idea创建j2ee_IntelliJ IDEA 创建J2EE项目

IntelliJ IDEA 创建J2EE项目 方式一 1.File--NewProject--next&#xff0c;取个名字&#xff0c;意味着你的文件存放地。 2.Next--Next--勾选Web Application--Finish。 3.Edit Configurations--添加--tomcat--local--找到WEB容器所地 4.&#xff2f;&#xff2b;&#xff0c;这…

J2EE总结

1.J2EE介绍 1.企业级java简史 一.Java版本 (1)J2ME,功能非常有限&#xff0c;用于嵌入式设备 (2)J2SE包含原始的核心类库&#xff0c;用于桌面应用程序和浏览器中的Applet (3)J2EE&#xff0c;功能非常全面&#xff0c;用于数据处理和服务器端应用 二.对现有和新技术的继承&…

关于J2ee

学习完j2se&#xff0c;对Java有了大概的了解&#xff0c;但是对接下来要学习的j2ee却有点囧&#xff0c;因为从概念里也get不到它到底是个什么东西&#xff01;so&#xff0c;从整体看j2ee&#xff0c;让百度告诉我答案。 Java2平台&#xff08;1998年12月&#xff0c;SUN公司…

J2EE架构简介

J2EE 体系结构简介 J2EE &#xff08;Java 2 Platform, Enterprise Edition&#xff09;即Java2平台企业版&#xff0c;它提供了基于组件的方式来设计、开发、组装和部署企业应用。J2EE使用多层分布式的应用模型&#xff0c;这个多层通常通过三层或四层来实现&#xff1a; ①客…

概览J2EE

J2EE是一种基于组件与平台无关的技术架构。 J2EE核心是一组技术规范和指南&#xff0c;包含各类的组件、服务架构、以及技术层次。 一、 J2EE的体系结构 先来看一些概念&#xff1a; 1、组件&#xff1a;是提供业务服务的独立功能单元&#xff0c;易操作&#xff0c;属性和实…

J2EE 全面简介

J2EE 全面简介 刘湛 (jeru@163.net) 武汉大学信息与计算科学系学士2001 年 7 月 本文从五个方面对J2EE进行了比较全面的介绍。从J2EE的概念说起,到它的优势,到J2EE典型的四层模型,和它的框架结构,最后是J2EE十三种核心技术的一个简介。本文分门别类的对J2EE中的服务,组件,…

自己搭建一个局域网(两台电脑)

1.首先保证两台电脑都有联网 2.更改适配器把两台电脑设为固定IP,同时让分配的IP地址相邻 3.使用ping命令&#xff0c;看是否能ping通。是&#xff0c;创建完成。否&#xff0c;有问题&#xff0c;重新分配固定IP后尝试。 哎&#xff0c;学校固定IP好像还要申请&#xff0c;哈哈…

如何用笔记本创建局域网

怎么用笔记本创建局域网呢&#xff1f;会不会很难&#xff1f; 现在教一个简单的方法创建局域网。 1、首先使用快捷键“WinR”打开cmd。 2、接着在弹出的窗口输入netsh wlan set hostednetwork modeallow ssid(这里输入你想给你局域网起的名字) key(这里输入自己设定的密码)&…

搭建小型局域网

Packet Tracer 是 Cisco 公司针对 CCNA 认证开发的一个用来设计、配置和故障排除网络的模拟软件。Packer Tracer 模拟器软件比 Boson 功能强大&#xff0c;比 Dynamips 操作简单&#xff0c;非常适合网络设备初学者使用。 学习任务 1、安装 Packer Tracer&#xff1b; 2、利用…

局域网组建

(1)回答问题&#xff1a;要想为计算机分配IP地址&#xff0c;必须要安装什么协议&#xff1f; 肯定是TCP/IP协议,安装及分配IP地址方法如下。按下面路径:控制面板》网络和 Internet》网络和共享中心》更改适配器设置》找到本地连接》右键属性&#xff0c;然后 1&#xff09; 添…

不同局域网内进行网络连接的建立方法

前言 在这互联网和物联网的时代&#xff0c;网络连接与通信被使用的越来越多&#xff0c;如何建立两个网络IP地址的连接 &#xff08;TCP或者UDP连接&#xff09;&#xff0c;也是一门学问。之前项目中遇到了这方面的问题&#xff0c;也被纠缠了一番&#xff0c;查阅大量资料&…

企业局域网的组建步骤和方法

什么是局域网&#xff1f;所谓的局域网(Local Area Network&#xff0c;简称LAN)&#xff0c;用于将有限范围内&#xff08;例如一个实验室、一层办公楼或者校园&#xff09;的各种计算机、终端与外部设备互联成网。企业局域网怎么建立&#xff1f;首先来了解下不同规模企业网络…

建立局域网的条件

建立局域网的条件 我的意思是硬件方面&#xff0c;比如说2台电脑连接在一个路由器上&#xff0c;那么可以通过设置来建立局域网吗&#xff1f;要是想并联多台电脑的话。。。还需要什么硬件来建立局域网&#xff1f;谢谢高人帮助 建立局域网&#xff0c;如果2113不上网的话&…

如何创建一个局域网

如果你在家庭里建设小型的局域网&#xff0c;只需网线、路由器或者集线器或交换机即可。将网线连好后&#xff0c;做相应的设置就可以组建成局域网了。推荐用路由器&#xff0c;较方便。 对于Windows xp&#xff0c;典型的路由器共享上网 以下方法是我试过&#xff0c;可以将已…

如何在win10系统建立局域网

在办公环境内&#xff0c;局域网的作用可不小。团队的文件管理&#xff0c;打印机等设备共享&#xff0c;部分之间资料的分享以及日程排期信息交互等等&#xff0c;都离不开局域网。本文主要和大家探讨如何在win10系统建立局域网。 更多系统安装教程尽在小白系统重装官网 系统…

局域网搭建

局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;是在一个局部的地理范围内&#xff08;如一个学校、工厂和机关内&#xff09;&#xff0c;一般是方圆几千米以内&#xff0c;将各种计算机&#xff0c;外部设备和数据库等互相联接起来组成的计算机通信网。 局…