226 lines
5.2 KiB
Markdown
226 lines
5.2 KiB
Markdown
<h2><center>awk 数组与函数</center></h2>
|
||
|
||
------
|
||
|
||
## 一:数组
|
||
|
||
`awk`可以使用关联数组这种数据结构,索引可以是数字或字符串。
|
||
|
||
`awk`关联数 组也不需要提前声明其大小,因为它在运行时可以自动的增大或减小。
|
||
|
||
### 1. 语法格式
|
||
|
||
```shell
|
||
array_name[index]=value
|
||
```
|
||
|
||
- array_name:数组的名称
|
||
- index:数组索引
|
||
- value:数组中元素所赋予的值
|
||
|
||
### 2. 创建数组
|
||
|
||
定义了一个站点(sites)数组,该数组的索引为网站英文简称,值为网站访问地址。
|
||
|
||
```bash
|
||
[root@wxin ~]# awk 'BEGIN {
|
||
sites["qfedu"]="www.qfedu.com";
|
||
sites["google"]="www.google.com"
|
||
print sites["qfedu"] "\n" sites["google"]
|
||
}'
|
||
www.qfedu.com
|
||
www.google.com
|
||
```
|
||
|
||
### 3. 访问数组
|
||
|
||
访问数组元素语法格式
|
||
|
||
```shell
|
||
array_name[index]
|
||
```
|
||
|
||
访问数组元素
|
||
|
||
```bash
|
||
[root@wxin ~]# awk -F: '{username[++i]=$1} END{print username[1]}' /etc/passwd
|
||
root
|
||
[root@wxin ~]# awk -F: '{username[i++]=$1} END{print username[1]}' /etc/passwd
|
||
bin
|
||
[root@wxin ~]# awk -F: '{username[i++]=$1} END{print username[0]}' /etc/passwd
|
||
root
|
||
```
|
||
|
||
按元数个数遍历
|
||
|
||
```bash
|
||
[root@wxin ~]# awk -F: '{username[x++]=$1} END{for(i=0;i<x;i++) print i,username[i]}' /etc/passwd
|
||
0 root
|
||
1 bin
|
||
2 daemon
|
||
3 adm
|
||
4 lp
|
||
5 sync
|
||
6 shutdown
|
||
7 halt
|
||
|
||
[root@wxin ~]# awk -F: '{username[++x]=$1} END{for(i=1;i<=x;i++) print i,username[i]}' /etc/passwd
|
||
1 root
|
||
2 bin
|
||
3 daemon
|
||
4 adm
|
||
5 lp
|
||
6 sync
|
||
7 shutdown
|
||
8 halt
|
||
9 mail
|
||
10 operator
|
||
```
|
||
|
||
按索引遍历
|
||
|
||
```bash
|
||
[root@wxin ~]# awk -F: '{username[x++]=$1} END{for(i in username) {print i,username[i]} }' /etc/passwd
|
||
17 sshd
|
||
4 lp
|
||
18 postfix
|
||
5 sync
|
||
19 mysql
|
||
6 shutdown
|
||
7 halt
|
||
8 mail
|
||
9 operator
|
||
10 games
|
||
20 nginx
|
||
|
||
[root@wxin ~]# awk -F: '{username[++x]=$1} END{for(i in username) {print i,username[i]} }' /etc/passwd
|
||
17 tss
|
||
4 adm
|
||
18 sshd
|
||
5 lp
|
||
19 postfix
|
||
6 sync
|
||
7 shutdown
|
||
8 halt
|
||
9 mail
|
||
10 operator
|
||
20 mysql
|
||
11 games
|
||
|
||
# 注:变量i是索引
|
||
```
|
||
|
||
### 4. 删除元素
|
||
|
||
删除数组元素语法格式
|
||
|
||
```shell
|
||
delete array_name[index]
|
||
```
|
||
|
||
**删除数组元素**
|
||
|
||
删除数组中的 google 元素(删除命令没有输出):
|
||
|
||
```bash
|
||
[root@wxin ~]# awk 'BEGIN {
|
||
sites["qfedu"]="www.qfedu.com";
|
||
sites["google"]="www.google.com"
|
||
delete sites["google"];
|
||
print fruits["google"]
|
||
}'
|
||
```
|
||
|
||
### 5. 多维数组
|
||
|
||
AWK 本身不支持多维数组,不过我们可以很容易地使用一维数组模拟实现多维数组。
|
||
|
||
如下示例为一个 3x3 的三维数组:
|
||
|
||
```shell
|
||
100 200 300
|
||
400 500 600
|
||
700 800 900
|
||
```
|
||
|
||
实例中,array0 存储 100,array0 存储 200 ,依次类推。
|
||
|
||
要在 array0 处存储 100, 使用: array["0,0"] = 100。
|
||
|
||
使用 0,0 作为索引,这并不是两个索引值,而是一个字符串索引 0,0。
|
||
|
||
**模拟二维数组**
|
||
|
||
```bash
|
||
[root@wxin ~]# awk 'BEGIN {
|
||
array["0,0"] = 100;
|
||
array["0,1"] = 200;
|
||
array["0,2"] = 300;
|
||
array["1,0"] = 400;
|
||
array["1,1"] = 500;
|
||
array["1,2"] = 600;
|
||
# 输出数组元素
|
||
print "array[0,0] = " array["0,0"];
|
||
print "array[0,1] = " array["0,1"];
|
||
print "array[0,2] = " array["0,2"];
|
||
print "array[1,0] = " array["1,0"];
|
||
print "array[1,1] = " array["1,1"];
|
||
print "array[1,2] = " array["1,2"];
|
||
}'
|
||
|
||
array[0,0] = 100
|
||
array[0,1] = 200
|
||
array[0,2] = 300
|
||
array[1,0] = 400
|
||
array[1,1] = 500
|
||
array[1,2] = 600
|
||
```
|
||
|
||
在数组上可以执行很多操作,比如,使用 asort 完成数组元素的排序,或者使用 asorti 实现数组索引的排序等等。
|
||
|
||
## 二:函数
|
||
|
||
awk的函数有许多,除了系统自带的内建函数还有就是用户自定义的函数。
|
||
|
||
**AWK 常用的函数**
|
||
|
||
```shell
|
||
rand() # 返回0 和1 之间一个随机数
|
||
srand() # 生成随机数种子
|
||
int() # 取整数
|
||
length([s]) # 返回指定字符串的长度
|
||
sub(r,s,[t]) # 对t字符串进行搜索,r表示的模式匹配的内容,并将第一个匹配的内容替换为s
|
||
gsub(r,s,[t]) # 对t字符串进行搜索,r表示的模式匹配的内容,并全部替换为s所表示的内容
|
||
split(s,array,[r])# 以r为分隔符,切割字符串s,并将切割后的结果保存至array 所表示的数组中,第一个索引值为1, 第二个索引值为2,…也就是说awk的数组下标是从1开始编的
|
||
substr(s,i,[n]): # 从s所表示的字符串中取子串,取法:从i表示的位置开始,取n个字符。
|
||
systime() # 取当前系统时间,结果形式为时间戳。
|
||
system() # 调用shell中的命令。空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用""引用起来。
|
||
```
|
||
|
||
**自定义函数示例**
|
||
|
||
```shell
|
||
function fname ( arg1,arg2 , ... ) {
|
||
statements
|
||
return expr
|
||
}
|
||
```
|
||
|
||
- fname为函数名,
|
||
- arg1...为函数的参数,
|
||
- statements是动作语言,
|
||
- return expr为由 statements 的结果从而决定最终函数所显示的内容。
|
||
|
||
**自定义函数示例**
|
||
|
||
```bash
|
||
[root@wxin ~]# cat fun.awk
|
||
function max(v1,v2) {
|
||
v1>v2?var=v1:var=v2
|
||
return var
|
||
}
|
||
BEGIN{a=3;b=2;print max(a,b)}
|
||
awk –f fun.awk
|
||
```
|
||
|