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

AWK命令

 

 

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}' #输出每行最后一个字段

AWK命令

 

AWK命令

 

 AWK命令

 

 AWK命令

 

 AWK命令

 

 

g、条件语句
if(表达式) awk语句1
else awk语句2

awk '{if($2>=70) print $1}' kpi.txt

AWK命令

 

 

i、循环
head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) print c}' #取第一行,从第2个列到最后一个列数,输出列号

AWK命令

 

 

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
}

 

原文链接: https://www.cnblogs.com/binfirechen/p/16265450.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    AWK命令

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/189110

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午2:38
下一篇 2023年2月12日 下午2:39

相关推荐