AWK

一、NF $NF

$NF 代表:最后一个列(field)

NF 代表:浏览记录的域个数


ls -l |awk '/^d/ {print $NF}'

   查看当前目录下的所有目录文件

[root@lee1 opt]# cat a
1.2.3.4.5
[root@lee1 opt]# awk -F . '{print NF}' a
5


二、FS OFS

FS 输入字段分隔符(缺省为:space:),相当于-F选项

OFS输出字段分隔符(缺省为:space:)

[root@lee1 opt]# cat a
1.2.3.4.5
[root@lee1 opt]# awk -F . '{print NF}' a
5
[root@lee1 opt]# awk -F . 'BEGIN {OFS="/"}{NF=5;print $0}' a
1/2/3/4/5



三、AWK匹配

有这样需求:需要提取一个zip包中文件所在的目录,就是文件所在的上层目录的绝对路径

比如 a/b/c.sh c.sh文件的路径就是 a/b

zip包的内容如下 :

123628883.jpg


unzip -l game.zip |awk '/game\//&& !/\/$/ {print $4}' | awk -F / 'BEGIN {OFS="/"}{NF=NF-1;print $0}'

awk中的匹配段的内容意思是:找到有“game/” 且不以“/” 结尾的行

查看结果:

123738429.jpg


四 数组

awk的数组,一种关联数组,下标可以是数字和字符串。因无需对数组名和元素提前声明,也无需指定元素个数

有这样的需求:有两列数据,第一列为用户名,第二列为数值,计算出总值,并按第二列的值排序


[root@lee1~]#cat a
a 1
b 11
c 123
a 2
v 3
c 245
b 235
[root@lee1~]#awk '{name[$1]+=$2} END{for(i in name) { if(name[i] != null)print i , name[i]}}' a | sort -n -k2 -r
c 368
b 246
v 3
a 3