awk是真的难,学了一下,感觉还是云里雾里的,讲者说awk更像是一门语言,而不是一个行编辑工具,可能这个东西需要反复咀嚼吧。
Chapter9 认识awk
awk更像是脚本语言。
awk用于"比较规范"的文本处理,用于统计数量并输出指定字段。
使用sed将不规范的文本,处理为"比较规范的文本"。
awk脚本的流程控制
输入数据前例程 BEGIN{}
主输入循环{}
所有文件读取完成例程 END{}
Chapter10 awk的字段
awk的字段引用和分离
记录和字段
每行称作AWK的记录
使用空格、制表符分隔开的单词称为字段
可以自己制定分隔的字段
字段的引用
awk中使用 2 ... $n表示每一个字段
awk '{ print $1,$2,$3}' filename
awk可以使用 -F
选项改变字段分隔符
awk -F ',' '{print $1,$2,$3}'filename
分隔符可以使用正则表达式
# $0打印一整行
awk '/^menu/{ print $0 }' /boot/grub2/grub.cfg
#以单引号做分隔符,输出第二个字段
awk -F "'" '/^menu/{ print $2}' boot/grub2/grub.cfg
# x++显示指定的行
awk -F "'" '/^menu/{ print x++,$2}' boot/grub2/grub.cfg
Chapter11 awk表达式
赋值操作符
=
是最常用的赋值操作符,如
var1 = "name" #awk等号左右可以加空格,也可以不加
var2 = "hello" "world"
var3 = $1
其他赋值操作符
++自增 -- += -= *= /= %= ^=
算数操作符
+ - * / % ^
系统变量
F5和OFS字段分隔符(输入的),OFS表示输出的字段分隔符。
RS记录分隔符,默认的记录分隔符是\n
NR和FNR行数。
NF字段数量,最后一个字段内容可以用 $NF 取出。
#BEGIN表示读入文件之前做的准备工作,如果不设置OFS的话,默认的分隔符是空格
head -5 /etc/passwd | awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}'
head -5 /etc/passwd | awk 'BEGIN{RS=":"}{print $0}'
#NR输出行号,$0输出行内容
head -5 /etc/passwd | awk '{print NR, $0}'
#输出字段数量
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}'
关系操作符
< > <= >= == != ~ !~
布尔操作符
&& || !
Chapter12 awk判断和循环
awk的条件和循环
条件语句
条件语句使用if开头,根据表达式的结果来判断执行哪条语句。
if(表达式)
awk语句1
[else
awk语句2
]
如果有多个语句需要执行可以使用{}
将多个语句括起来。
cat kpi.txt
user1 70 72 74 76 74 72
user2 80 82 84 82 80 78
user3 60 61 62 63 64 65
user4 90 89 88 87 86 85
user5 45 60 63 62 61 50
#输出第二字段大于等于80的
awk '{if($2>=80) print $1}' kpi.txt
循环
while 循环
while(表达式)
awk语句1
do 循环
do{
awk 语句1
}while(表达式)
for循环
for(初始值;循环判断条件;累加)
awk语句1
影响控制的其他语句
break
continue
#计算一行的总值
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)}'
#计算各行平均值,要设置sum的初始值为0
awk '{sum=0;for(c=2;c<=NF;c++) sum+=$c ;print sum/(NF-1)}'
Chapter13 awk数组
数组的定义
数组:一组有某种关联的数据(变量),通过下标一次访问。
数组名{下标}=值。
下标可以使用数字也可以使用字符串。
数组的遍历
for(变量 in 数组名)
使用 数组名 [变量] 的方式依次对每个数组的元素进行操作。
删除数组
delete 数组[下标]
命令行参数数组
ARGC,ARGV
Chapter14 awk数组功能的使用
vim result.awk
{
sum = 0
for( column = 2 ; column <= NF ; column++)
sum += $column
average[$1] = sum /(NF-1)
}
END{
for( user in average)
sum_all += average[user]
avg_all = sum_all/NR
for( user in average)
if( average[user] > avg_all)
above++
else
below++
print "above",above
print "below",below
}
Chapter 15 awk函数
算数函数
sin() cos()
int()
rand() srand()
#取整
awk 'BEGIN{pi=3.14 ;print int(pi) }'
字符串函数
gsub(r,s,t)
index(s,t)
length(s)
match(s,r)
split(s,a,sep)
sub(r,s,t)
substr(s,p,n)
自定义函数
function 函数名(参数) {
awk语句
return awk变量
}
网友评论