awk用法进阶

一、控制语句

1 if-else语句

       使用场景:对awk取得的整行或某个字段做条件判断

       语法:

              if(condition) statement [else statement]

              if(condition1){statement1}else if(condition2){statement 2}else{statement3}

例:判断uid是否大于等于500,是则为普通用户,否则为root或系统用户

]#awk -F: '{if($3>=500){printf "Common User: %-15s,uid %d\n",$1,$3} else {printf "Root or Sysuser: %-15s,uid %i\n",$1,$3}}' /etc/passwd

blob.png

例:取id为偶数的用户名及UID

blob.png

例:取出shell为bash的用户

blob.png

例:判断磁盘的利用率,大于20则给出警告。

]#df -Th |awk -F[%] '/^\/dev\/(sd|ma).*/{print $1}' |awk '{if($NF>=20){printf "Warning,%s usage has %d\n",$1,$NF} }'

blob.png

2 while循环语句

       语法:while(condition) {statements}

              条件为真,进入循环;条件为假,退出循环

       使用场景:对一行内的多个字段逐一进行类似处理时使用,对数组中的元素逐一处理时使用

例:统计/etc/grub2.cfg文件中以linux16(前面可跟任意个空格)开头的行的每一个单词的字符数

]#awk '/^[[:space:]]*linux16/{num=1;while(num<=NF){print $num,length($num);num++}}' /etc/grub2.cfg

blob.png

例:在上一个例子的基础上,只显示字符数大于等于7的单词。

]#awk '/^[[:space:]]*linux16/{n=1;while(n<=NF){if(length($n)>=7){print $n,length($n)}n++}}' /etc/grub2.cfg

blob.png

3 do-while循环语句

       语法:do statement while(condition)

       无论判断条件为真或假,至少执行一次循环体

]#awk '{do{print "I am the King! "} while($1=="King")}' /etc/passwd

blob.png

4 for循环语句

       语法:for(expr1;expr2;expr3)  {statements}

                for(变量赋值;条件;变量修正)

例:使用for循环实现统计/etc/grub2.cfg文件中以linux16(前面可跟任意个空格)开头的行的每一个单词的字符数,并只显示字符数大于等于7的

]#awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++){if(length($i)>=7){print $i,length($i)}}}' /etc/grub2.cfg

blob.png

       for的特殊用法:

              能够遍历数组中的元素:for(var in array) {for-body}

例:

awk 'BEGIN{test["1st"]="First";test["2nd"]="Second";for(a in test){print test[a]}}'

blob.png

5 switch语句

       语法:switch(expression) {case VALUE1 or /REGEXP1/:statement1;case VALUE2 or /REGEXP2/:statement2;….;default:statement}

例: 

]#awk '{switch($3) { case "xfs":print "i am xfs" ; case "ext4":print "i am ext4";default : print "unknown"; }}' /etc/fstab

blob.png

注:switch语句在CentOS7系列中使用正常,在6中使用会报错误提示。

6 break&continue

break [n]用于退出循环体,不再执行循环。

       在for循环中使用

blob.png

       在while循环中使用

blob.png

continue用于退出当次循环,continue后面的循环体不再运行,而是直接进入下一次循环。只能用在for循环体中。

blob.png

continue用在while循环中,不能正确退出

blob.png

7 next

       用于控制awk的内生循环,提前结束对当前行的处理,直接进入下一行。

例:取出id号为奇数的用户名

]#awk -F: '{if($3%2==0){next}else{print $1,$3}}' /etc/passwd

blob.png

8、数组

在awk中,所有数组都是关联数组。

关联数组:array[index-expression]

       index-expression

       1)可使用任意字符串,字符串要使用双引号””

       2)如果某数组元素事先不存在,在引用时,awk会自动创建次元素,并将其值初始化为“空串”

       若要判断在数组中是否存在某元素,要使用“index in array”格式进行。

       若要遍历数组中的每一个元素,需要使用for循环

       for(var in array){for-body}

       注意:var的值为数组的下标

例:分别统计网络连接中的LISTEN、ESTABLISHED状态的连接数

netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state){print i,state[i]}}'

blob.png

ss -tan |awk '/^[LE]/{state[$1]++}END{for(i in state){print i,state[i]}}'

 blob.png

例:

(1)统计/etc/fstab文件中每个文件类型出现的次数

cat /etc/fstab | awk '!/^#/&&!/^$/{fstype[$3]++}END{for(i in fstype){print i,fstype[i]}}'

blob.png

(2)统计指定文件中每个单词出现的次数

cat /etc/fstab | awk -F[" "=/,"\t"] '{for(i=1;i<=NF;i++){word[$i]++}}END{for(n in word){print n,word[n]}}'

blob.png

二、函数

内置函数

自定义函数

1、内置函数

数值处理

       rand():返回0和1之间的一个随机数

字符串处理

       length([s]):返回指定字符串的长度。

       split(s,a[,r]):以r为分隔符切割s,并将切割后的结果保存至a所表示的属组中

       其数组下标从1开始

例:统计远程连接到当前主机的ip数

netstat -tan | awk '/^tcp\>/{split($5,ip,":");ip_count[ip[1]]++}END{for(i in ip_count) print i,ip_count[i]}'

blob.png

       sub(r,s,[t]) :对t 字符串进行搜索r 表示的模式匹配的内容,并将第一个匹

配的内容替换为s。

例:将/etc/passwd中root用户的用户名替换为superman

blob.png

将/etc/fstab中ext4的文件类型替换为xfs

blob.png

       gsub(r,s,[t]) :对t 字符串进行搜索r 表示的模式匹配的内容,并全部替换

为s。

blob.png

2、自定义函数

格式:

function name ( parameter, parameter, … ) {

       statements

       return expression

}

原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/48231

(1)
M20-1钟明波M20-1钟明波
上一篇 2016-09-21 14:03
下一篇 2016-09-21 14:49

相关推荐

  • MHA–master在线修复

    本次实验基于【MHA+keepalive 高可用MYSQL集群】(续) 一、恢复背景 二、修复故障节点及MHA集群 三、提升已修复的节点为master 四、注意事项 一、恢复背景 1、设备清单 2、:percona-xtrabackup-2.3.2 (注:生产环境应定时备份;不应等到数据库DOWN后才备份,以免加剧集群的压力) 备份数据库操作: [root@…

    2017-03-01
  • 初识 vi/vim文本编辑器

    我们操作文件,终究离不开编辑文件,对文件内容的编辑,Linux系统下,我们通常使用VI/VIM来编辑文件。VI是每个Linux都会自带的文本编辑器,VIM是VI的增强版,现在的最新版都已自带,但是可能有些发行版本没有自带,可以使用sudo apt-get install vim命令安装vim。 可以使用vi或者vim命令直接进入新的文本文件,或者vim 文件…

    Linux干货 2017-07-29
  • M22 使用非对称密钥实现ssh自动登陆

    一 实验目的 一般在用户使用ssh客户端登陆ssh服务器时需要使用用户名和密码,本实验使用非对称加密的方式实现了无密码登陆ssh服务器。 二 实验流程  、 1 在客户端生成非对称密钥对 2 将非对称密钥中的公钥发送给ssh服务器端相应的帐号 3 当客户端通过ssh协议与服务器端发起连接时,客户端将私钥加密过的签名发送给服务器端,服务器端使用客户端…

    2017-04-13
  • linux软链接与硬链接的区别

    硬链接:相于当给文件增加了一个新名 在添加链接时会增加链接数,其inode结点数不会增加 支持绝对路径与相对路径 硬链接不能对目录来创建 不能跨分区来创建链接 硬链接链接到文件被删除时,依旧可以通过链接文件来访问被删文件的数据 软链接:可以支持对目录来创建链接 (注,当你用rm -rf 删除目录的时候,目录不会删除,但目录中的内容会被删除,并且会删除源文件)…

    Linux干货 2013-07-15
  • N26-第六周作业-邢岩

    马哥门徒-N26-邢岩      一直以来都用windows 的word来编辑文件,从今天开始,我又学会了新的编辑文件方式了,掩饰不住愉悦的心情!没错,就是vim 编辑器,一个神奇的编辑器!让我来详细介绍一下这个神器是如何使用的吧。     vim:vim其实就是(VI IMproved) vi增强…

    Linux干货 2017-02-26
  • 用PHP编写Hadoop的MapReduce程序

    Hadoop流 虽然Hadoop是用java写的,但是Hadoop提供了Hadoop流,Hadoop流提供一个API, 允许用户使用任何语言编写map函数和reduce函数.Hadoop流动关键是,它使用UNIX标准流作为程序与Hadoop之间的接口。因此,任何程序只要可以从标准输入流中读取数据,并且可以把数据写入标准输出流中,那么就可以通过Hadoop流使…

    Linux干货 2015-04-13