魏长东

weichangdong

awk小悟

之前在awk下使用for循环的时候,老是想着for() do done,使用变量还用$,使用的都是shell的语法。今天发现awk也是一门语言,有自己的语言结构。

cat nginx-fifo-kk.log |sed -n '1,10p'|awk '{++a[$1]}END{for (wcd in a) {print wcd,"==",a[wcd]}}'

使用的时候,直接用wcd,而不是$wcd,打印数组a的数据,用a[wcd]而不是$a[wcd]。

另外关于awk的NR和NF,OFS 和ORS也有了点认识。

[root@bj-171-121 changdong.wei]# cat old
uid=12345&act=wcd.php
uid=12346&act=wcd.php
uid=1235&act=wcd.php
uid=1245&act=wcd.php
uid=1345&act=wcd.php
uid=2345&act=wcd.php
uid=1&act=wcd.php
uid=15&act=wcd.php
uid=345&act=wcd.php
uid=5&act=wcd.php
uid=3&act=wcd.php
[root@bj-171-121 changdong.wei]# awk -F= 'BEGIN{OFS="|";ORS="##"}{print NR,$0}' old
1|uid=12345&act=wcd.php##2|uid=12346&act=wcd.php##3|uid=1235&act=wcd.php##4|uid=
1245&act=wcd.php##5|uid=1345&act=wcd.php##6|uid=2345&act=wcd.php##7|uid=1&act=
wcd.php##8|uid=15&act=wcd.php##9|uid=345&act=wcd.php##10|uid=5&act=wcd.php##11|uid=
3&act=wcd.php##

可以看出NR是行。NF是经过-F分隔后总共的列数。OFS是经过-F分隔后输出连接符号。ORS是输出整个行于下一行的分隔,默认是换一行的。我上面的例子让用##连接行了。