1.其它编程语言数组的下标一般从0开始,awk中数组下标默认从1开始,也可以从0开始设置:

awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";print huluwa[1]}'
二娃
awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";huluwa[4]="";print huluwa[4]}'
第二条命令没有内容输出

2.在awk中,元素的值设置为"空字符串"是合法的,所以不能用元素值是否为空,判断该元素是否存在于数组中.

当一个元素不存在于数组时,引用该元素,awk会自动创建这个元素,为这个元素赋值为空字符串,
所以引用一个不存在于数组的元素时,这个元素已经被赋值了,也就是已经存在了.
awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";huluwa[4]="";
if(5 in huluwa){print "第6个元素存在就能看到这句话"}}'

3.使用语法if(下标 in 数组名),可以判断数组中是否存在对应的元素.

awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";huluwa[4]="";
if(!(5 in huluwa)){print "第6个元素存在就能看到这句话"}}'
第6个元素存在就能看到这句话

4.用delete可以删除数组中的元素,也可以删除整个数组

awk 'BEGIN{huluwa["yiwa"]="大娃";huluwa["erwa"]="二娃";
huluwa["sanwa"]="三娃";print huluwa["yiwa"];delete huluwa["yiwa"];print huluwa["yiwa"]}'
大娃 awk 'BEGIN{huluwa["yiwa"]="大娃";huluwa["erwa"]="二娃";
huluwa["sanwa"]="三娃";print huluwa["yiwa"];delete huluwa;print huluwa["yiwa"]}'
大娃

5.两种for循环

awk 'BEGIN{huluwa[1]="大娃";huluwa[2]="二娃";huluwa[3]="三娃";
huluwa[4]="四 娃";for(i=1;i<=4;i++){print i,huluwa[i]}}'
1 大娃
2 二娃
3 三娃
4 四娃
awk 'BEGIN{ huluwa["yiwa"]="大娃";huluwa["erwa"]="二娃";huluwa["sanwa"]="三 娃"huluwa["siwa"]="四娃";for(i in huluwa){print i,huluwa[i]} }'
siwa 四娃
yiwa 大娃
erwa 二娃
sanwa 三娃

发现数组其实是无序的,可以把它当成python中的字典.

6.数组应用1:

awk 'BEGIN{ a=1; print a; a++; print a}'
1
2
当字符串或者空字符串参与运算时,将被当做数字0.
awk 'BEGIN{ a="test"; print a; a++; print a; a++; print a}'
test
1
2
awk 'BEGIN{ a=""; print a; a++; print a; a++; print a}' 1
2
引用数组中一个不存在的元素时,元素被赋值为空字符串,参与运算时被当做0使用
awk 'BEGIN{ print a["ip"]; a["ip"]++;a["ip"]++; print a["ip"]}' 2

统计ip出现的次数:

# cat test10
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.12
192.168.1.3
192.168.1.3
192.168.1.2
192.168.1.4
192.168.1.12
192.168.1.1
# awk '{count[$1]++} END{for(i in count) {print i,count[i]} }' test10
192.168.1.12
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4

awk实现统计ip次数

7.数组应用2:

# cat test4
zhangsan lisi
wangwu zhaoliu
zhouqi zhangsan wangwu
lisi zhaoliu
# awk '{ for(i=1;i<=NF;i++){a[$i]++} } END{ for(j in a){print j,a[j]} }' test4
zhaoliu
zhangsan
wangwu
lisi
zhouqi

awk统计名字出现次数

8.数组应用3:

# cat a.txt
李四|
张三|
王五|
赵六|
# cat b.txt
|
|
|
|
|
|
|
|
# awk -F '|' 'NR == FNR{a[$2]=$1;} NR>FNR {print a[$1],"|", $0}' a.txt b.txt
# awk -F "|" 'NR == FNR{a[$2]=$1;next}{print a[$1],"|",$0}' a.txt b.txt
# awk -F "|" 'NR == FNR{a[$2]=$0;next}{print a[$1]"|"$2}' a.txt b.txt
张三 | |
张三 | |
李四 | |
李四 | |
李四 | |
王五 | |
王五 | |
赵六 | |

数组的活学活用

解释说明:

在NR == FNR时,也就是在处理前四行时,将数组的格式变成:

a={"000002":"李四","000001":"张三","000003":"王五","000001":"赵六"},

处理剩下的行时,用a[$1]去找姓名,再加上每一行内容就是想要的内容.

9.内置函数(用到时再研究)

常用的算数函数--rand、srand、int;
字符串函数--sub、gsub替换某些文本,length函数获取指定字符串长度;
index函数获取的到指定字符串在整个字符串中的位置;
split函数可以将指定的字符串按照指定的分隔符分割,将每段内容赋值到数组中,从而动态的创建数组.

10.三元运算

三元运算语法:条件?结果1:结果2

使用变量usertype接收了三元运算后的返回值,当条件成立时,usertype被赋值为"系统用户",反之为"普通用户"
awk -F: '{ usertype=$3<500?"系统用户" : "普通用户"; print $1,usertype}' /etc/passwd
表达式1?表达式2:表达式3
awk -F: '{$3<500?a++:b++}END{print a,b}' /etc/passwd

11.打印奇偶行

# cat test11
第 行
第 行
第 行
第 行
第 行
第 行
第 行
第 行
第 行

test11文件内容

a.当使用了模式时,如果省略了对应的动作,会默认输出整行.

awk '$2>7' test11
第 8 行
第 9 行

b.awk中,0或空字符串表示'假',非0值或非空字符串表示'真'.

# awk '1{print $0}' test3
hello
helllo
# awk '1' test3
hello
helllo
# awk '0' test3 什么也不会输出
# awk '!0' test3 0取反,即为真
hello
helllo
# awk 'i=1' test3
hello
helllo

c.awk开始处理第一行,i被初始化,值为空,模式为假,所以i=!i,是将取反后的值又赋给了i,

此刻i的值为真,在awk处理第一行文本时i为真,且省略了动作,就会打印第一行内容;

在处理第二行时,将在第一行时为真的i取反,此时i为假,故第二行没有被打印.

awk 'i=!i' test11
第 1 行
第 3 行
第 5 行
第 7 行
第 9 行
awk '!(i=!i)' test11 或 awk 'a=!(i=!i)' test11
第 2 行
第 4 行
第 6 行
第 8 行

12.awk数组统计状态

# 先解释split和数组时怎样结合的:
awk -v ts="dawa;erwa;sanwa" 'BEGIN{ split(ts,huluwa,";");for(i in huluwa){print i,huluwa[i]} }'
1 dawa
2 erwa
3 sanwa
# split按照指定的分隔符切割字符串,将切割后的字段赋值到元组中,键是数字,值是对应字段.
netstat -pnta 2>&1|grep 'ESTABLISHED'|head | awk '{ split($5,a,":");b=a[1];c=a[2];{print b,c} }'
127.0.0.1 6025
127.0.0.1 6026
127.0.0.1 6025
127.0.0.1 6023
127.0.0.1 6025
127.0.0.1 6023
127.0.0.1 6023
127.0.0.1 6026
127.0.0.1 9090
127.0.0.1 6025
# 统计ESTABLISHED(已建立的连接)的远程ip:
netstat -pnta 2>&1|grep 'ESTABLISHED'|awk '{split($5,a,":");b=a[1];count[b]++}END{for(i in count)print i,count[i]}

13.注意几点书写:

不同模式之间用{}隔开;

数字的运算、判断放在()中;

数组的运算放在{}中;

print放在{}中.

参考博客:https://www.cnblogs.com/xudong-bupt/p/3721210.html

参考博客:https://www.cnblogs.com/jiqianqian/p/7944013.html

朱双印的博客写的很详细,通俗易懂:http://www.zsythink.net/archives/2093

awk数组详解、实战的更多相关文章

  1. 3.awk数组详解及企业实战案例

    awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...

  2. (转)awk数组详解及企业实战案例

    awk数组详解及企业实战案例 原文:http://www.cnblogs.com/hackerer/p/5365967.html#_label03.打印数组:1. [root@nfs-server t ...

  3. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  4. awk命令详解二

    awk命令详解 简单使用: awk :对于文件中一行行的独处来执行操作 . awk -F :'{print $1,$4}'   :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 . 详细介绍: ...

  5. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  6. linux awk命令详解,使用system来内嵌系统命令, awk合并两列

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  7. Shell学习(五)—— awk命令详解

    一.awk简介   awk是一个非常好用的数据处理工具,相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个[字段]处理,因此,awk相当适合处理小型的数据数据处理.awk是一种报 ...

  8. JavaScript进阶(十)Array 数组详解

    JS array 数组详解 数组的声明方法 arrayObj = new Array(); 的数组 ,并且第一位是5 数组的运算(传地址) var t2=new Array(); t2[0]=1; t ...

  9. Java基础之 数组详解

    前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...

随机推荐

  1. 蓝桥--2n皇后问题(递归)--搬运+整理+注释

    N皇后问题: #include <iostream> #include <cmath> using namespace std; int N; ];//用来存放算好的皇后位置. ...

  2. 枚举进程——暴力搜索内存(Ring0)

    上面说过了隐藏进程,这篇博客我们就简单描述一下暴力搜索进程. 一个进程要运行,必然会加载到内存中,断链隐藏进程只是把EPROCESS从链表上摘除了,但它还是驻留在内存中的.这样我们就有了找到它的方法. ...

  3. 在终端更改MAC的MySQL的root密码

  4. Appscan安全漏洞扫描使用(转)

    这里主要分享如何使用AppScan对一大项目的部分功能进行安全扫描. ----------------------------------------------------------------- ...

  5. Python学习-day8 socket进阶

    还是继续socket网络编程的学习. socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) Socket Fami ...

  6. BIT+DP

    2018CCPC网络赛 J - YJJ's Salesman HDU - 6447 YJJ is a salesman who has traveled through western country ...

  7. Eclipse调试程序及项目的导入导出

    Eclipse调试程序 调试概述: ①   调试就是测试程序的方法,主要的目的就是解决程序的逻辑问题,流程是:发现问题.修改问题.正确执行; ②   以前我们可以使用System.out.printl ...

  8. Welcome-to-Swift-03字符串和字符(Strings and Characters)

    String是例如“hello, world“”,“海贼王” 这样的有序的Character(字符)类型的值的集合,通过String类型来表示. Swift 的String和Character类型提供 ...

  9. ECMA-262 Extractions

    For the purpose of this article, ECMA-262 refers to ECMAScript® 2017 Language Specification. ECMAScr ...

  10. samba安装和配置

    windows和windows系统之间要实现文件共享是通过网络邻居实现linux和windows之间通过什么来实现文件共享呢?一.通过文件挂载(首先要制作ISO镜像文件,然后在用挂载命令)二.通过sa ...