awk思维导图
2021-04-05 20:55:24 1 举报
AI智能生成
awk思维导图
作者其他创作
大纲/内容
用途
报告生成器
生成<b><font color="#c41230">报表、表格</font></b>
将文本<b><font color="#c41230">格式化</font></b>为想要的报表
对文本进行较复杂的处理
实现
<b><font color="#c41230">gwk</font></b>(常用)
nwk(新实现)
定位
<b><font color="#0076b3">脚本语言</font></b>解释器
一种<b><font color="#c41230">编程语言</font></b>,进行文本<b><font color="#0076b3">复杂格式</font></b>处理
命令格式
通用格式:<b style=""><font color="#c41230">awk [options] 'Pattern{Action}' file</font></b><br>
多模式:<b><font color="#c41230">awk [options] 'Pattern1{Action1} Pattern2{Action2} ...' file1 file2 ...</font></b>
运行机制
默认<b><font color="#0076b3">行分隔符</font></b>:"<b><font color="#c41230">\n</font></b>",<b><font color="#0076b3">列分隔符</font></b>:"<b style=""><font color="#c41230">空格</font></b>"(可更改)
默认:满足<b><font color="#0076b3">模式Pattern</font></b>条件的文本,<b><font color="#0076b3">逐行进行处理,常用行为</font></b>:<b><font color="#c41230">print、printf</font></b><b><font color="#0076b3"><br></font></b>
特殊模式(执行一次):<b><font color="#c41230">BEGIN、END</font></b>
内置变量
获取:文件名、行号、列值等
流程
<b><font color="#c41230">if、while、三元表达式等</font></b>
内置函数
进行函数处理
options
对变量赋值等,如"<b><font color="#c41230">-v FS='.'</font></b>"来更改行分隔符
默认值
布尔判断:"0"或"空字符串"表示假;"非0"或"非空字符串"表示真
“非空字符串”和“空字符”在参与<b><font color="#0076b3">数字运算</font></b>时,均<b><font color="#0076b3">被当做0</font></b>
当对一个不存在的元素进行自加后,这个元素就变成了自加的次数
“非空字符串”和“空字符”在参与<b><font color="#0076b3">数字运算</font></b>时,均<b><font color="#0076b3">被当做0</font></b>
内置函数
计算函数
<b><font color="#c41230">int</font></b>
截取数字整数部分的值<br>(向下取整)
如:<b><font color="#0076b3">awk 'BEGIN{print int(1.23)}'</font></b>
<b><font color="#c41230">rand</font></b>
<b><font color="#c41230">srand</font></b>
字符串函数
<b><font color="#c41230">gsub</font></b>
指定范围内的<b><font color="#662c90">全局替换</font></b>
如:<b><font color="#0076b3">awk '{gsub("a","A",$1);print $1}' file</font></b><br>如每行中$1,有多个a,都会替换为A
<b><font color="#c41230">sub</font></b>
指定范围内的<b><font color="#662c90">单次替换</font></b>
如:<b><font color="#0076b3">awk '{sub("a","A",$1);print $1}' file</font></b><br>如每行中$1,有多个a,只会替换第1个a为A<br>
<b><font color="#c41230">length</font></b>
获取字符串长度
如:<b><font color="#0076b3">awk 'BEGIN{print length("张三")}'</font></b>
<b><font color="#c41230">index</font></b>
获取查询字符串<br>在整个字符串的位置
如:<b><font color="#0076b3">awk 'BEGIN{print index("张三","三")}'</font></b>
<b><font color="#c41230">split</font></b>
拆分字符串为数组
如:<br><b><font color="#0076b3">awk -v str="张三,李四" 'BEGIN{split(str,arr,",");for(i in arr){print arr[i]}}'</font></b><br>
其他函数
待补充
变量
内置变量
<b><font color="#c41230">NR</font></b>(Number of Records):当前处理的文本行的行号
访问多个文件时,如每个文件都有匹配内容,所有文件行号会一起计数,如:1,2,3,4
<b><font color="#c41230">FNR</font></b>(File Number of Records):各文件分别计数的行号
访问多个文件时,如每个文件都有匹配内容,每个文件行号分别计数,如:1,2,1,2
<b><font color="#c41230">FS</font></b>(Field Separator):输入列分隔符,默认"空格"
<b><font color="#662c90">输入</font></b>列分隔符变量:<b><font color="#c41230">FS</font></b>(Field Separator),<br>读取文件时使用,将每一行文本分隔成列
格式:"<b><font color="#c41230">-F分隔符</font></b>"<br>如:"<font color="#0076b3">awk -F. '{print $1}'</font>",指定分隔符为".",输出第1列
格式:"<b><font color="#c41230">-v FS='分隔符'</font></b>"<br>如:"<font color="#0076b3">awk -v FS='.' '{print $1}'</font>",指定输入分隔符为".",输出第1列
<b><font color="#c41230">OFS</font></b>(Out Field Separator):输出列分隔符,默认"空格"
<b><font color="#662c90">输出</font></b>列分隔符变量:<b><font color="#c41230">OFS</font></b>(Out Field Separator),<br>输出结果时使用,将每一行输出结果分隔成列
格式:"<b><font color="#c41230">-v OFS='分隔符'</font></b>"<br>如:"<font color="#0076b3">awk -v OFS=',' '{print $8,$9}'</font>",<br> 指定输出分隔符为"逗号",输出第8列,第9列,逗号分隔<br>
<b><font color="#c41230">RS</font></b>(Record Separator):输入行分隔符,默认"\n"
<font style=""><b><font color="#662c90">输入</font></b>行分隔符变量:</font><font color="#c41230" style="font-weight: bold;">RS</font>(Row Separator)<br>读取文件时使用,将文本内容,分隔成行
<b><font color="#c41230">ORS</font></b>(Output Record Separator):输出行分隔符,默认"\n"
<b><font color="#662c90">输入</font></b>行分隔符变量:ORS(Row Separator)<br>输出结果时使用,将输出结果行进行分隔
<b><font color="#c41230">FILENAME</font></b>:显示内容对应文件名
如<b><font color="#0076b3">数据来源为“通道”</font></b>,则输出为:"<font color="#c41230"><b>-</b></font>"
<b><font color="#c41230">ARGC</font></b>:命令行参数的<b><font color="#0076b3">个数</font></b>
<b><font color="#c41230">ARGV</font></b>:<b><font color="#0076b3">数组</font></b>,保存的是命令行所给定的<b><font color="#0076b3">各参数。</font></b>所有参数组成的数组(ARGV[0]是awk,<b><font color="#0076b3">'pattern{ action }'</font></b>不是参数)<br>
<b><font color="#c41230">NF</font></b>(Number of Fields):行的列数
列变量
<b><font color="#c41230">$0</font></b>:整行
<b><font color="#c41230">$1</font></b>:第1列<br><b><font color="#c41230">$2</font></b>:第2列<br>......
<b><font color="#c41230">$NF</font></b>:最后1行<br><b><font color="#c41230">$(NF-1)</font></b>:倒数第2行<br>......
自定义变量
<b><font color="#0076b3">参数options</font></b>中定义
<b><font color="#c41230">-v varname=value</font></b>
如:<b><font color="#0076b3">awk -v myVar="myValue" '{print myVar}' file</font></b>
优点:可以引用shell中变量。如:<br><b><font color="#0076b3">echo shellVar = "shell value"<br>awk -v myVar=shellVar '{print myVar}' file</font></b><br>
'Pattern{Action}'中<b><font color="#0076b3">直接使用</font></b>
如:<font color="#0076b3"><b>awk '{myVar="myValue";print myVar}'</b></font><b><font color="#0076b3"> file</font></b>
Pattern模式<br>(即执行条件,<b><font color="#0076b3">满足条件</font></b>的被执行)
空模式<br><font color="#c41230"><b>{Action}</b></font>
无条件。如“<b><font color="#c41230">{print $0}</font></b>”
<b><font color="#0076b3">所有行</font></b>都执行后面的动作
条件模式<br><b><font color="#c41230">Pattern{Action}</font></b>
自定义条件,如"<b><font color="#c41230">NR>1{print $0}</font></b>"<br><b><font color="#0076b3">满足条件Pattern的</font><font color="#c41230">行</font></b>执行后面的动作
支持关系运算符
【普通】:<b><font color="#c41230"><、<=、>、>=、==、!=</font></b>
【变量正则为真】:"<b><font color="#c41230">~</font></b>",如:<font color="#0076b3"><b>x ~ /正则/</b></font>
【变量正则不为真】:"<b><font color="#c41230">!~</font></b>",如:<b><font color="#0076b3">x !~ /正则/</font></b>
BEGIN/END模式
<b><font color="#c41230">BEGIN</font></b>:处理文本之前进行的操作<b><font color="#c41230"><br></font></b>
用途:如打印表头<br><b><font color="#0076b3">awk '</font><font color="#c41230">BEGIN</font><font color="#0076b3">{print "大小","名称"} {print $5,$9}' fileName</font></b><br>
<b><font color="#c41230">END</font></b>:处理完所有行之后的操作
用途:如进行汇总信息输出<br><b><font color="#0076b3">awk '{sum++} </font><font color="#c41230">END</font><font color="#0076b3">{printf "文件总数:%s",sum}' file</font></b><br>
正则模式
格式:<b><font color="#c41230">awk '/正则exp/{Action}'</font></b>
如: <b><font color="#0076b3">awk '/西游记/{print $0}' file</font></b>
范围:满足正则表达式的<b><font color="#662c90">所有行</font></b>,执行后面的操作
行范围模式
格式:<b><font color="#c41230">awk '/正则1/,/正则2/{Action}'</font></b>
如:<b><font color="#0076b3">awk '/a{2}/,/c{2}/ {print $0}' file</font></b>
范围:[满足正则表达式1的第一行~满足正则表达式2第一行],闭区间内的所有行,执行后面的操作
Action动作
【定位】:对行内容进行处理
【命令分隔方式】<br>最外面的'{}'为固定写法
"<b><font color="#c41230">;</font></b>"分号
如:<b><font color="#0076b3">awk '{print $1;print $2}' file</font></b>
"<b><font color="#c41230">{xxx}{xxx}</font></b>"大括号
如:<b><font color="#0076b3">awk '{{print $1}{print $2}}' file</font></b>
条件判断
【语法】<br><b><font color="#c41230">if(条件1){xxx}else if(条件2){xxx}else{xxx}</font></b>
如<br><b><font color="#0076b3">awk '{if(NR==1){print "第一行"}else if(NR==2){print "第二行"}else{print "其他行"} }' file</font></b><br>
循环控制<br>支持break、continue
<b><font color="#c41230">for(初始化;布尔判断;变更){xxx}</font></b>
如: <font color="#0076b3"><b>awk 'BEGIN{for(i=0;i<3;i++){print $0}}'</b></font>
<b><font color="#c41230">for(变量 in 数组){xxx}</font></b>
<b><font color="#c41230">while(布尔表达式){xxx}</font></b>
如:<b><font color="#0076b3">awk -v i=1 'BEGIN{while(i<=3){print i;i++}}'</font></b>
<b><font color="#c41230">do{xxx}while(布尔表达式)</font></b>
如:<b><font color="#0076b3">awk -v i=1 'BEGIN{do{print i;i++}while(i<=3)}'</font></b>
三元运算符
<font color="#c41230">表达式?true时执行:false时执行</font>
如:<b><font color="#0076b3">awk '{NR==1?count+=0:count++}END{print count}' file</font></b>
结束动作
<b><font color="#c41230">exit<br></font></b>结束awk命令(<b><font color="#662c90">除了END模式</font></b>)
ext结束当前awk内<b><font color="#662c90">除了END模式外</font></b>的所有动作,如果有END模式,则跳出所有模式的动作,执行END模式
如:<b><font color="#0076b3">awk '{if(NR==3){exit}else{print $0}} END{print "END模式"}' file</font></b>
<b><font color="#c41230">next</font></b><br>结束当前行
awk是一行行处理数据的,next<b><font color="#c41230">结束当前正在处理的行</font></b>,直接进入到下一行进行处理
如:<b><font color="#0076b3">awk '{if(NR==3){next}else{print NR,$0}} END{print "END模式"}' file</font></b>
输出
内置输出:<b><font color="#c41230">print</font></b>
实现简单的文本输出,不能对文本进行格式化<br>末尾自带换行<br>
如 <br>print $1<br>print $1,$2
格式化输出:<b><font color="#c41230">printf</font></b>
可以对文本进行格式化输出<br>支持格式替换符(如%s替代字符串)<br><b><font color="#0076b3">末尾不带换行</font></b>
指定的格式和列之间,<br>需要用","逗号分隔
如:<br><b><font color="#0076b3">awk '{printf "第1列:%s,第2列:%s\n",$1,$2}'</font></b><br>
格式替换符的数量必须和参数的数量一致
0 条评论
下一页