awk 作为强大的文本处理工具,少不了数组处理。
awk 中数组叫做关联数组(associative arrays),下标可以是数字也可以是字符串。awk 中的数组不必提前声明,也不必声明大小,初始化数组元素用 0 或空串,这根据上下文而定。
一 语法
语法: awk '{pattern + action}' 或 awk 'pattern {action}'
其中 pattern 表示 AWK 在数据中查找的内容, action 是在找到匹配内容时所执行的一系列命令。花括号 {} 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组(作用域)。
二 数组定义
1 一维数组
a) 数字下标
array[1]="it"
array[2]="homer"
array[3]="sunboy"
array[4]=2050
b) 字符下标
array["first"]="yang"
array["second"]="gang"
array["third"]="sunboy"
示例 1:
#!/bin/bash awk 'BEGIN{ array[1]="it" array[2]="homer" array[3]="sunboy" array[4]=2050 array["first"]="yang" array["second"]="gang" array["third"]="sunboy" print array[1], array[4] print array[3], array["third"]}'结果:
it 2050
sunboy sunboy
示例 2:
#!/bin/bash awk 'BEGIN{ for(i=1; i<=5; i++){ array[i] = i*2 - 1; } for(i in array){ print i" = " array[i]; } }'结果:
4 = 7
5 = 9
1 = 1
2 = 3
3 = 5
注: for in 输出数组元素顺序是不定的,下面介绍对数组如何排序
2 二维数组
awk 多维数组在本质上是一维数组,因awk在存储上并不支持多维数组,awk提供了逻辑上模拟二维数组的访问方式。例如,array[2,3] = 1这样的访问是允许的。
awk使用一个特殊的字符串SUBSEP (\034)作为分割字段,在上面的例子 array[2,3] = 1 中,关联数组array存储的键值实际上是2\0343,2和3分别为下标(2,3),\034为SUBSEP分隔符
类似一维数组的成员测试,多维数组可以使用 if ( (i,j) in array) 语法,但是下标必须放置在圆括号中。
类似一维数组的循环访问,多维数组使用 for ( item in array ) 语法遍历数组。与一维数组不同的是,多维数组必须使用split()函数来访问单独的下标分量,格式: split ( item, subscr, SUBSEP), 例如: split (item, array2, SUBSEP); 后,array2[1]为下标“2”, array2[2]为下标“3”
示例:
#!/bin/bash awk 'BEGIN{ for(i=1; i<=3; i++){ for(j=1; j<=3; j++){ array[i, j] = i * j; print i" * "j" = "array[i,j]; } } print for(i in array){ split(i, array2, SUBSEP); print array2[1]" * "array2[2]" = " array[i]; } }'结果:
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
注: 示例中 split(i, array2, SUBSEP); 即是把二维数组作为一维数组处理,同样数组元素顺序不确定,下面将介绍数组排序
三 数组函数
1) 数组长度(length)
length(array) 获取数组长度, split 分割数组也返回数组长度,
1、内核模块hello.c程序如下
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Hello World Module");
MODULE_ALIAS("a simplest module");
static int __init hello_init() //易错:“__”为两个下划线,不是一个下划线
{
printk(KERN_EMERG"Hello World!\n"); //KERN_EMERG这个为优先级字符代表
return 0;
}
static void __exit hello_exit()
{
printk("<6>hello exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
ifneq ($(KERNELRELEASE),)
obj-m := hello.o // "obj -m"指的是编译内核模块,”obj -y“指的是内核编译
else
KDIR := /lib/modules/2.6.18-53.el5/build
all:
make -C $(KDIR)
M=$(PWD) modules //”-C“指定的是内核路径所在位置 ,”M=“指内核模块所在当前位置
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
/etc/rc.d/init.d/postgresql-9.1
可以看到它里面默认使用了一个名为postgres的OS用户名(从这个脚本可以看到很多yum在安装postgresql后的目录位置、环境变量等)。这个postgres用户名就是(http://www.postgresql.org/docs/9.1/static/database-roles.html)这里提到的
In order to bootstrap the database system, a freshly initialized system always contains one predefined role. This role is always a "superuser",
and by default (unless altered when running initdb) it will
have the same name as the operating system user that initialized the database cluster. Customarily, this role will be named postgres.
In order to create more roles you first have to connect as this initial role.
也就是说,系统会默认创建一个role,而且这个role在不指定(可以通过initdb指定)的情况下,它的name和当前初始化数据库实例的OS用户的name一样的。一般这个name就是postgres。从/etc/rc.d/init.d/postgresql-9.1里面也可以看到,脚本会把很多文件和文件夹的owner设置为postgres。
所以当你刚安装好postgres,迫不及待的想通过psql连接数据库的时候都会遇到(http://www.postgresql.org/docs/9.1/static/tutorial-createdb.html)这里提到的错误。因为psql认为你要使用当前的OS用户的name去连接数据库。错误如下:
createdb: could not connect to database postgres: FATAL: role "joe" does not exist当然,如果你自己的OS用户的name就是postgres,那你运气就太好了。:D
所以你需要
su - postgres来切换到postgres用户下去,然后一个简单的:
psql就可以顺利的连接到数据库了。
然后\password 可以修改你的密码。
在postgres下面
createuser root切换到root下面后,就可以
createdb默认创建名为root的数据库。然后psql命令就可以连接到数据库了。