AWK的知识点积累
shell 脚本向awk 传递参数
1. shell 脚本中向awk 命令传递参数的简单例子:
num=$1
awk -F',' 'BEGIN{
for(i = 0; i < awk_num; i++)
{
a[i] = 0;
}
}
{
for(i = 0; i < awk_num; i++)
{
if($3%awk_num == i)
{
a[i]++;
}
}
}
END{
for(i = 0; i < awk_num; i++)
{
print i, "=", a[i];
}
}' awk_num=$num test.txt
本例中将shell中的变量num值传递给awk的awk_num变量
2. 简单的命令:
line_tmp=`expr 2 \* $line - 1`
host_name=`cat $1|awk 'BGEIN{OFS="\t"}NR==awk_num,NR==(awk_num+1){print $1}' awk_num=$line_tmp`
echo "$host_name" >> /home/zengtai.csm/.tmp/.check/result.txt
2. awk 打印指定行
- 打印 12--15行:
cat t1
12 bbbbbbbbbbb
13 ccccccccccc
14 aaaaaaaaaaa
15 bbbbbbbbbbb
16 ccccccccccc
awk 'BEGIN{print "line:13--15";}NR==13,NR==15{print $0}' t1
line:13--15
ccccccccccc
aaaaaaaaaaa
bbbbbbbbbbb
3. awk printf()格式:
echo $1|awk -F"-" '{printf("%s-%s-%s %s:%s",$1,$2,$3,$4,$5)}'`
4. awk 的数组、循环
awk -F[\ :] '{s[$2]++}END{for(i in s){print i,s[i]}}' test.log2012-05-24 | sort -n
以 :冒号为间隔符,以文档第二个域作为数据的下标来统计第二个域进行分类并进行统计每一类出现的数量;最后再按大小进行排序输出
5. awk 正则表达式
cat tt
cn1.test.ck3
cn2.test.ck3
cn3.test.ck3
cn4.test.ck3
cn5.test.ck3
cn6.test.ck3
cn7.test.ck3
cn1.test.ck6
cn2.test.ck6
cn3.test.ck6
cn4.test.ck6
cn5.test.ck6
cn6.test.ck6
cn7.test.ck6
(1). 其中一个于满足几个条件
第一个域匹配正则表达式cn[0-3] 而且第三个域满足 ck[358] 结尾的打印出来
awk -F'.' '$1 ~/cn[0-3]/ && $3 ~/ck[348]$/{print $0}' tt ----> 正则表达式 与 输出正文 { } 之间没有 空格
cn1.test.ck3
cn2.test.ck3
cn3.test.ck3
(2). 模式中只要是正则表达式就必须用 //来表示:而且可以有多个条件
awk -F'.' '/^(cn|so)/ && $1 ~/cn[0-4]/ && $3 ~/[358]$/{print $0}' tt
cn1.test.ck3
cn2.test.ck3
cn3.test.ck3
cn4.test.ck3
(3). 模式是关系表达式
cat ttt
10:20:30:40:50:60
5:15:25:35:45:55
2:12:22:32:42:52
8:18:28:38:48:58
(4). 第一个域 能被 5整除,会打印此行的第三个于 + 12 和 第5个域 + 14 的值
awk -F':' '$1 % 5 == 0{print $3 + 12,$5+14}' ttt
42 64
37 59
(5). awk 自定义输出格式
awk -F':' '$1 % 5 ==0{printf("%s-%s-%f-%d-%d\n",$1,$2,$3,$4,$5+11)}' ttt
10-20-30.000000-40-61
5-15-25.000000-35-56