我不会接受我不要的未来
哪怕是命中注定

awk动作(action)

awk可以使用if,if……else,for,while等条件判断

练习:

判断1.txt中如果不是192.168开头的IP,输出$0

awk分别用for,while输出循环

awk 'BEGIN{for(i=0;i<10;i++){print i}}' 

awk -v i=0 'BEGIN{while(i<10){print i;i++}}'

  • continue 结束本次循环
  • break 跳出整个循环
  • exit 退出awk,当有END模式时,exit跳出awk执行END
  • next 处理下一行

 awk 'BEGIN{for(i=0;i<10;i++){if(i==3){continue};{print i}}}'

awk 'BEGIN{for(i=0;i<10;i++){if(i==3){break};{print i}}}'

awk 'BEGIN{for(i=0;i<10;i++){if(i==3){exit};{print i}}}END{print "OVER"}'

awk -F ":" '{if($1=="root")print $0}' /etc/passwd

awk -F ":" '{if($1=="root"){next};print $0}' /etc/passwd

awk -F ":" '{if($1=="root" || $1=="uucp"){next};print $0}' /etc/passwd

awk sort统计IP访问数量:

awk '{print $1}' access.log|sort|uniq -c|sort -k 1 -n -r

例子1:定义数组,并且打印数组元素

[root@tab0 ~]# awk ‘BEGIN{a[0]=”xiaohong”;a[1]=”xiaolan”;print a[0]}’

xiaohong

[root@tab0 ~]# awk ‘BEGIN{a[0]=”xiaohong”;a[1]=”xiaolan”;print a[1]}’

Xiaolan

例子2:打印出所有元素的下标

[root@tab0 ~]# awk ‘BEGIN{a[0]=”xiaohong”;a[1]=”xiaolan”;for (i in a)print i;}’

0

1

解释:将a定义为循环中的取值列表。从数组中取出的是数组的所有元素的下标

 

例子3:我们将/etc/passwd/ 里边的第一类定义成数组

 

[root@localhost ~]#:awk -F: ‘{{a[NR]=$1;}{print NR,a[NR];}}’ /etc/passwd

awk '{array[$1]++} END {for(key in array) print array[key],key}' a |sort -k 2 -nr

上边例子中的array[$1]++

(1)Awk在读取第一行的时候,会读取这个数组,此时的数组是这样的:a[192.168.3.1]++

(2)此时a[192.168.3.1]的值是未定义的。

但是由于后边有运算符号++。Awk会将数字0自动赋值给a[192.168.3.1]。然后在做++运算

(3)此时a[192.168.3.1]做++ ,也就是0+1得到的值为1

(4)那么在读第二个192.168.3.1时,此时a[192.168.3.1]的值已经经过上次运算为1.此时在做一次运算。也就是1+1 现在a[192.168.3.1]的值为2。

(5)总结,最后的值是多少,也就意味着,192.168.3.1运算了多少次,也意味着192.168.3.1出现了多少次。

赞(0)
未经允许不得转载:技术搬运工 » awk动作(action)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我们不生产技术 我们只是技术的搬运工