AWK用法全解
一、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用法全解的更多相关文章
- 3.awk数组详解及企业实战案例
awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...
- linux awk命令详解
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- awk命令详解二
awk命令详解 简单使用: awk :对于文件中一行行的独处来执行操作 . awk -F :'{print $1,$4}' :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 . 详细介绍: ...
- CSS样式设置语法全解,样式优先级、值和单位、字体、文本、块级元素,行内元素,替换元素、非替换元素、display、float、position、table、li、光标、边距边框、轮廓、颜色背景
全栈工程师开发手册 (作者:栾鹏) 一个demo学会css css选择器全解 css操作语法全解 CSS样式设置语法全解: 样式优先级 1. !important标记的样式 > 内联样式(sty ...
- shell编程之awk命令详解
shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...
- (转)awk数组详解及企业实战案例
awk数组详解及企业实战案例 原文:http://www.cnblogs.com/hackerer/p/5365967.html#_label03.打印数组:1. [root@nfs-server t ...
- linux awk命令详解,使用system来内嵌系统命令, awk合并两列
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- Shell学习(五)—— awk命令详解
一.awk简介 awk是一个非常好用的数据处理工具,相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个[字段]处理,因此,awk相当适合处理小型的数据数据处理.awk是一种报 ...
- awk理论详解、实战
答疑解惑: 为什么用awk取IP的时候用$4? ifconfig eth0 | awk -F '[ :]+' 'NR==2{print $4}' IP第二行内容如下: inet addr:10.0.0 ...
- Linux 三剑客之 awk 实战详解教程
我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...
随机推荐
- vue练习用免费开源api大全
1. 网易云api 网易云api是网上一位大神工具网易云获取的,数据都是真实的网易云数据 2. api大全 这是csdn一个兄弟收集的,种类挺多,就是有一些需要money,不过大部分还是免费的 3. ...
- vivo 大规模容器集群运维平台实践
作者:来自 vivo 互联网服务器团队- Zhou Qi .Kong Manyu 容器平台已经成为支持应用运维和部署的重要基础设施,当前 vivo 内部容器平台共有20+生产集群,管理数万物理机节点, ...
- MS17_010漏洞利用,渗透win7,拿到桌面的flag
关于使用MS17_010来攻击WIN7: 我们先ping一下win7的ip看看是否可以ping通(ping不通的可以关闭win7的防火墙),然后我们用nmap扫一下看看靶机有什么漏洞 nmap --s ...
- QTableView实现在表格内直接对数据库内容进行修改、新增和删除等操作
文章目录 前言 QSqlTableModel 新增 删除 修改 提交 取消 前言 本文主要利用QSqlTableModel+QTableView来实现直接在QTableView中进行对数据库数据的操作 ...
- Docker管理面板系列——Portainer
一.介绍 Portainer是个轻量级的Docker管理面板,和Rancher这种重量级选手没法比,Portainer倾向于单机的管理(后来发现能够添加多个单机节点切换着管理),当然,在Docker搞 ...
- Hyperledger Fabric - 链码部署
前提条件 启动测试网络 ./network-myself.sh up 创建通道 ./network-myself.sh createChannel 智能合约(链码) pom.xml文件 配置远程仓库 ...
- 探秘Transformer系列之(23)--- 长度外推
探秘Transformer系列之(23)--- 长度外推 目录 探秘Transformer系列之(23)--- 长度外推 0x00 概述 0x01 背景 1.1 问题 1.2 解决思路 1.3 微调的 ...
- Python+Selenium+unittest实例
代码如下: # coding=utf-8 import time import unittest from selenium import webdriver class BaiduSearch(un ...
- 国产的 Java Solon v3.2.0 发布(央企信创的优选)
Solon 框架! Solon 是新一代,Java 企业级应用开发框架.从零开始构建(No Java-EE),有灵活的接口规范与开放生态.采用商用友好的 Apache 2.0 开源协议,是" ...
- git rebae -i
这个命令大体作用就是对本地的commit进行修改,适用于以下情况: 本地历史排查修改 code review后,打回修改 详解 pick,只是意味着包括提交.重新进行命令时,重新安排pick命令的顺序 ...