AWK命令
a、awk与sed的区别
awk用于”比较规范“的文本处理,用于统计数量并输出字段
sed将不规范的文本,处理成”比较规范“的文本
b、awk的流程控制
输入数据前例承 BEGIN{}
主输入循环 {}
所有文件读取完成例程 END{}
c、记录和字段
每行称作AWK记录
使用空格、制表符分割开的单词称作字段
可以自定指定分割的字段
d、字段引用
awk中使用 $1 $2 ...$n表示每个字段,$0代表当前行
awk '{print $1,$2,$2}' filename
awk可以使用-F选型改变字段分割符
awk -F '{print $1,$2,$2}' filename
分隔符可以使用正则表达式
awk '/^menu/{print $0}' aa.txt
awk -F "," '/^menu/{print $2}' aa.txt
e、AWK表达式
赋值、算数、系统变量、关系操作符、布尔操作符
赋值 = ++ -- += -- *= /= %= ^=
系统变量
FS和OFS字段分隔符,OFS表示输出的字段分割符 (Filed Splite)
RS记录分割符 (Record Splite)
NR和FNR行数 (Number Row) FNR支持多个文件一起输出
NF字段数量,最后一个字段内容可以用$NF取出 (Number Field)
head -5 /etc/passwd | awk -F ":" '{print $1}'
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1}'
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1,$2}' #输出的多个变量使用,分割
head -5 /etc/passwd | awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}' #指定字段输出OFS -
head -5 /etc/passwd | awk 'BEGIN{RS=":"}{print $0}' #指定行记录分割符号为:
head -5 /etc/passwd | awk '{print NR}' #输出行号
head -5 /etc/passwd | awk '{print NR,$0}' #输出行号和该行记录
awk '{print NR,$0}' /etc/passwd aa.txt #将多个文件合并输出
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}' #输出每行列数
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $NF}' #输出每行最后一个字段
g、条件语句
if(表达式) awk语句1
else awk语句2
awk '{if($2>=70) print $1}' kpi.txt
i、循环
head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) print c}' #取第一行,从第2个列到最后一个列数,输出列号
head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) print $c}' #输出每列数值
head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) sum+=$c;print sum}' #计算总分
head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) sum+=$c;print sum/(NF-1)}' #计算平均分
awk '{sum=0; for(c=2;c<=NF;c++) sum+=$c; print $1,sum/(NF-1)}' kpi.txt #输出每行平均分
awk '{sum=0; for(c=2;c<=NF;c++) sum+=$c; average[$1]=sum/(NF-1)}END{for(user in average) print user,average[user]}' kpi.txt
g、使用awk -f 运行awk命令
awk -f kpi.awk kpi.txt
kpi.awk
{sum=0; for(c=2;c<=NF;c++) sum+=$c; average[$1]=sum/(NF-1)}END{for(user in average) print user,average[user]}
{
sum=0;
for(c=2;c<=NF;c++)
sum+=$c
avage[$1]=sum/(NF-1)
}
END{
for(user in avage)
sum_all+=avage[user]
avg_all=sum_all/NR
for(user in avage)
if(avage[user]>=avg_all)
above++
else
below++
print above,below
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix