awk的工作方式是: 通过给定的参数,去逐行读取文本(或通过管道传递的内容),通过模式判断,再执行对应的动作
awk如何处理每一行的内容: awk每读一行,会将这一行的内容定义为$0, 再通过空格将这一行切割成多个字符串, 按顺序分别定义为$1 $2 $3 $4......以此类推
这一篇讲动作
动作,在awk中用{}包含,常见的动作包含:定义、计算、循环与判断、输出等
定义:
例1:
#这个动作定义了一个变量a等于NR,这里的NR是一个awk的内置变量,用于记录第几行,每读一行文件,a就会更新,文件读完了之后输出a的结果,也就是文件的行数
awk '{a=NR}; END {print a}' /etc/passwd
例2:
#这里定义了一个数组,索引是NR,内容是$0,最后输出其中一行
awk '{line[NR] = $0}; END {print line[12]}' /etc/passwd
例3:
#FS是一个awk的内置变量,用于指定分隔符,默认是空格,这里将其改为冒号
awk 'BEGIN {FS=":"}; {print $4}' /etc/passwd
计算:
例1.行数
#自己定义一个变量num,没有初始化,默认为0,每读一行加一
awk '{num = num+1}; END {print num}' /etc/passwd
例2.加减
#使用变量相加,最后输出时减一
awk -F ":" '{sum=sum+$3}; END {print sum-1}' /etc/passwd
例3.乘除
#初始化为1,如果第三个字段不为0就相除,最后乘以2
#注意,awk可以不用定义变量即可使用,但是用做计算时该变量为0
awk -F ":" 'BEGIN {s=1}; $3 != 0 {s = s/$3}; END {print s*2}' /etc/passwd
循环:
例1.for
#这里结合上面的例子,在文件读完之后,加入一个for循环,将数组里面的内容逐行输出
awk 'BEGIN {FS=":"}; {line[NR] = $0};
END{
for (i in line){
printf("%s\n", line[i])
}
};
' /etc/passwd
#上面的顺序是乱的,因为awk用的是关联数组,如果要按顺序输出,可以根据函数length取数组line的长度,再进行循环;
awk 'BEGIN {FS=":"}; {line[NR] = $0};
END{
for (i=1;i<=length(line);i++)
printf("%s\n", line[i])
};
' /etc/passwd
例2.while
#和for循环基本没差别
awk 'BEGIN {FS=":"}; {line[NR] = $0};
END{
while (i<=NR-5){
printf("%s\n", line[i])
i++
}
};
' /etc/passwd
例3.if
awk 'BEGIN {FS=":"}; {line[NR] = $0};
END{
if (length(line)>30){
printf("%s\n", "该文件的总行数大于30")
}
else{
printf("%s\n", "该文件的总行数小于30")
}
};
' /etc/passwd