一、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
1 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、条件语句

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

 1 {
2 if ( $1 == "foo" ) {
3 if ( $2 == "foo" ) {
4 print "uno"
5 } else {
6 print "one"
7 }
8 } else if ($1 == "bar" ) {
9 print "two"
10 } else {
11 print "three"
12 }
13 }

5.2、循环语句

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

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

5.3、数组

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

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

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

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

1 for ( x in myarray ) {
2 print myarray[x]
3 }

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

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

六、awk的内置函数

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

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

将会报错:

1  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()还将设置两个变量,叫作RSTART和RLENGTH。RSTART包含返回值(第一个匹配的位置),默认返回RESTART,RLENGTH指定它占据的字符跨度(如果没有找到匹配,则返回-1) print 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的格式化输出

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

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

AWK用法全解的更多相关文章

  1. 3.awk数组详解及企业实战案例

    awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...

  2. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  3. awk命令详解二

    awk命令详解 简单使用: awk :对于文件中一行行的独处来执行操作 . awk -F :'{print $1,$4}'   :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 . 详细介绍: ...

  4. CSS样式设置语法全解,样式优先级、值和单位、字体、文本、块级元素,行内元素,替换元素、非替换元素、display、float、position、table、li、光标、边距边框、轮廓、颜色背景

    全栈工程师开发手册 (作者:栾鹏) 一个demo学会css css选择器全解 css操作语法全解 CSS样式设置语法全解: 样式优先级 1. !important标记的样式 > 内联样式(sty ...

  5. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  6. (转)awk数组详解及企业实战案例

    awk数组详解及企业实战案例 原文:http://www.cnblogs.com/hackerer/p/5365967.html#_label03.打印数组:1. [root@nfs-server t ...

  7. linux awk命令详解,使用system来内嵌系统命令, awk合并两列

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  8. Shell学习(五)—— awk命令详解

    一.awk简介   awk是一个非常好用的数据处理工具,相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个[字段]处理,因此,awk相当适合处理小型的数据数据处理.awk是一种报 ...

  9. awk理论详解、实战

    答疑解惑: 为什么用awk取IP的时候用$4? ifconfig eth0 | awk -F '[ :]+' 'NR==2{print $4}' IP第二行内容如下: inet addr:10.0.0 ...

  10. Linux 三剑客之 awk 实战详解教程

    我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...

随机推荐

  1. vue练习用免费开源api大全

    1. 网易云api 网易云api是网上一位大神工具网易云获取的,数据都是真实的网易云数据 2. api大全 这是csdn一个兄弟收集的,种类挺多,就是有一些需要money,不过大部分还是免费的 3.  ...

  2. vivo 大规模容器集群运维平台实践

    作者:来自 vivo 互联网服务器团队- Zhou Qi .Kong Manyu 容器平台已经成为支持应用运维和部署的重要基础设施,当前 vivo 内部容器平台共有20+生产集群,管理数万物理机节点, ...

  3. MS17_010漏洞利用,渗透win7,拿到桌面的flag

    关于使用MS17_010来攻击WIN7: 我们先ping一下win7的ip看看是否可以ping通(ping不通的可以关闭win7的防火墙),然后我们用nmap扫一下看看靶机有什么漏洞 nmap --s ...

  4. QTableView实现在表格内直接对数据库内容进行修改、新增和删除等操作

    文章目录 前言 QSqlTableModel 新增 删除 修改 提交 取消 前言 本文主要利用QSqlTableModel+QTableView来实现直接在QTableView中进行对数据库数据的操作 ...

  5. Docker管理面板系列——Portainer

    一.介绍 Portainer是个轻量级的Docker管理面板,和Rancher这种重量级选手没法比,Portainer倾向于单机的管理(后来发现能够添加多个单机节点切换着管理),当然,在Docker搞 ...

  6. Hyperledger Fabric - 链码部署

    前提条件 启动测试网络 ./network-myself.sh up 创建通道 ./network-myself.sh createChannel 智能合约(链码) pom.xml文件 配置远程仓库 ...

  7. 探秘Transformer系列之(23)--- 长度外推

    探秘Transformer系列之(23)--- 长度外推 目录 探秘Transformer系列之(23)--- 长度外推 0x00 概述 0x01 背景 1.1 问题 1.2 解决思路 1.3 微调的 ...

  8. Python+Selenium+unittest实例

    代码如下: # coding=utf-8 import time import unittest from selenium import webdriver class BaiduSearch(un ...

  9. 国产的 Java Solon v3.2.0 发布(央企信创的优选)

    Solon 框架! Solon 是新一代,Java 企业级应用开发框架.从零开始构建(No Java-EE),有灵活的接口规范与开放生态.采用商用友好的 Apache 2.0 开源协议,是" ...

  10. git rebae -i

    这个命令大体作用就是对本地的commit进行修改,适用于以下情况: 本地历史排查修改 code review后,打回修改 详解 pick,只是意味着包括提交.重新进行命令时,重新安排pick命令的顺序 ...