awk详解—变量与关联数组(部分)
标签搜索

awk详解—变量与关联数组(部分)

mrui
2024-09-26 / 0 评论 / 50 阅读 / 正在检测是否收录...

在awk中,各种字段是用美元符号和字段编号来引用的($1,$2,$3等)。

awk中还有内建变量。如NF,其中保存着当前行中的字段总数,而$NF指向的是最后一个字段,加入ls的输出行共有8个字段,那么NF的值是8,$NF的值是改行中的第8个字段(等同于$8)。

此外,读取awk变量时不需要使用$符合。比如NF本身就是一个有效的变量引用。在其之前加上$就将其含义从“当前行的字段总数”改成了“当前行的最后一个字段”。又比如在awk的for循环中,假设循环变量为i,那么像引用变量i的值,直接写作i即可。那么$i代表什么呢?变量i的值被解析成一个数字,然后“美元符号-数字”的表达式会被理解为引用某个输入字段或单词,即第i个字段。

逆序输出输入行的单词
[root@web1 ~]# tail -5 /etc/passwd | awk -F: '{
for (i=NF; i>0; i--){
printf "%s ", $i;
}
printf "\n"
}'
/bin/false /var/lib/mysql MySQL Server 27 27 x mysql
/sbin/nologin /usr/share/httpd Apache 48 48 x apache
/sbin/nologin /var/lib/rpcbind Rpcbind Daemon 32 32 x rpc
/sbin/nologin /var/lib/nfs RPC Service User 29 29 x rpcuser
/sbin/nologin /var/lib/nfs Anonymous NFS User 65534 65534 x nfsnobody
#当for循环中的条件改为i>=0时,会输出原始的行。因为$0代表本行所有的列。
[root@web1 ~]# tail -5 /etc/passwd | awk -F: '{
for (i=NF; i>=0; i--){
printf "%s ", $i;
}
printf "\n"
}'
/bin/false /var/lib/mysql MySQL Server 27 27 x mysql mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
/sbin/nologin /usr/share/httpd Apache 48 48 x apache apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
/sbin/nologin /var/lib/rpcbind Rpcbind Daemon 32 32 x rpc rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
/sbin/nologin /var/lib/nfs RPC Service User 29 29 x rpcuser rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
/sbin/nologin /var/lib/nfs Anonymous NFS User 65534 65534 x nfsnobody nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
汇总数字列表
#汇总文件夹下所有文件的总大小。
[root@web1 ~]# ls -l | awk '{sum+=$5}END{print sum}'
2959663563
统计字符串出现的次数

使用到的工具是awk的关联数组(其他语言中的散列或字典)。
本例中统计的是网站的访问量,显示的结果是IP地址及其访问次数。
关于下面这行代码
ip[$1]++
这里将IP地址($1的值)被用作数组索引。该数组的实际元素为ip[118.113.18.252]、[111.229.150.53]等。
之所以称该数组为关联数组,是因为使用散列表将每个独一的字符串与数值关联了起来。这些事情awk已经自动做好,不需要在手动进行字符串的比较或查找。
建立好数组之后,为了获取数组中每个元素的值,awk提供了一种特殊形式的for循环,与数字形式的for(i=0;i<=10;i++){}不同,它有专用于关联数组的语法。
for(i in ip){}
在该语句中,变量i连续从数组ip的索引中获取值(没有特定顺序)。也就是说i会在每次循环中都得到一个值(如本例中的IP地址,111.229.150.53、111.229.150.53等这些值)。而ip[i]则会返回数组元素的值。
关联数组是awk的一个强大特性。

[root@web1 ~]# awk '
{ip[$1]++}
END{for(i in ip){
print i "\t" ip[i]
}
}' access.log|sort -nr -k2 | head -5
118.113.18.252  13345
111.229.150.53  3803
180.163.28.109  3553
180.163.28.143  3435
180.163.30.76   3322
0

评论

博主关闭了当前页面的评论