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