模式扫描与处理语言awk小结
时间:2007-04-24 来源:freewildwolf
1、 语法格式:
awk ‘程序’ 文件名,程序形如:模式{动作}
awk一次一行地读入文件名中的输入,依次与每个模式比较,对匹配的行执行相应的操作,和sed
一样,并不改变输入文件的内容。awk中的程序也可以来自命令文件,如
awk –f 命令文件 文件名…
2、 字段
awk自动将每个输入行分成字段,即由空格或者Tab分隔的非空格字符串。
awk称这些字段为$1、$2、...、$NF,其中NF的值被设置为字段的个数。注意NF和$NF的差别,前者指字段的个数,后者指最后一个字段。不同于shell,awk中只有字段是以$开始,变量是不加修饰的。
awk通常假设用空白空间分隔字段,但是分隔符也是可以设置的。用-F命令选项。例打印来自于第一个字段的用户名,可以用 $ awk –F: ‘{print $1}’ 这里的分隔符被设置为冒号
3、 打印
内嵌变量NR指当前输入记录或者行的序数。可以这样:$awk ‘{print NR, $0}’
字段$0是未加更改的整个输入行。print命令的打印格式可以实现一般的打印要求,使用printf
可以实现像C语言那样的打印输出。
4、 模式
下例是查找没有口令的用户。程序可用如下模式:
$awk –F: ‘ $2= =” ” ’ /etc/password
该模式查看第二个字段是否为空字符串。可用其他几种方法写此模式:
$2= = “ ”
$2 ~ /^$/
$2 ! ~ / . /
length($2)= =0
符号~表示与正则表达式匹配,!~的意义是不匹配,正则表达式本身被包括在两个斜杠内。
Length是awk的内部函数,它得到字符串的长度。可以在模式前加!,使其变反。
另外其他的内部函数如substr功能类似于C中的同名函数。
5、 注释
遵循shell规则,以#标识注释部分。
6、 BEGIN与END模式
BEGIN在读入第一个输入行之前就被执行,可使用BEGIN模式初始化变量。
$ awk ‘BEGIN {FS =”:”}
> $2 = = “ “ ’ /etc/password
END动作在处理完最后一行后执行。如:
$ awk ‘END{ print NR }’
7、 算术运算和变量
awk提供与C一样的算术运算操作。
awk中的变量可以存放字符串。变量是被视为数字串还是字符串,取决于上下文。
awk内部变量表
变量 |
含义 |
FILENAME |
当前输入的文件名 |
FS |
字段分隔符 |
NF |
输入记录中字段的个数 |
NR |
输入记录数 |
OFMT |
数字的输出格式 |
OFS |
输出字段分隔字符串(默认空格) |
ORS |
输出记录分隔字符串(默认换行) |
RS |
输入记录分隔符(默认是换行) |
Awk操作符列表
操作符 |
含义 |
= += -= *= /=%= |
同其他高级语言定义 |
expr1||expr2 |
或运算。任意为真结果即为真。第一个为真不计算第二个 |
&& |
与运算。两者为真结果为真。第一个失败不计算第二个 |
! |
表达式求反 |
> >= < <= = = != ~ !~ |
关系操作符,~和!~是匹配和不匹配 |
nothing |
字符串连接。如’hello,’’wold’结果为’hello,world’ |
+ - * / % , ++ -- |
|
8、 控制流
awk中也有if条件语句、for循环和while循环,break和continue语句,这些都同于C中的语法。而next语句促成在awk程序起始处重新开始读入下一个输入行和匹配模式,exit语句则立即转向END模式。
9、 数组
数组和变量一样不需要声明。一个数组大小仅受所用机器可用内存的限制。
awk还支持一种关联数组,即数组的下标不一定是整数,任意数值包括字符串都可以成为下标。
10、awk中的内嵌函数
函数 |
含义 |
Cos(表达式) |
表达式的余弦 |
Exp(表达式) |
对表达式取自然指数 |
Getline() |
读入下一个输入行:若文件结束,返回0,否则为1 |
Index(字符串1,字符串2) |
字符串1中字符串2的位置,不存在返回0 |
Int(表达式) |
表达式的整数部分,向0截取 |
Length(字符串) |
字符串的长度 |
Log(表达式) |
表达式的自然对数 |
Sin(表达式) |
表达式的正弦 |
Split(字符串,a,c) |
以字符c为分隔符将s分隔为a[1]…a[n]并返回n |
Sprintf(格式,…) |
格式化 |
Substr(字符串,m,n) |
起始于位置m的字符串的n个字符的子串 |
11、与shell交互
尽量使用单引号,使用双引号使得程序不易读懂,下面程序打印参数列的内容
awk ‘ { print $’ $1 ’ } ’
awk “{ print \$$1 }”
12、其他
设置定时运行程序,比如定时打印日期:
$ at 5am
mytask
ctrl –d
设置每天定时运行程序:
$cat loopmytask
mytask
echo loopmytask | at 5am
第二行语句为第二天安排下一个at命令,因此,一旦启动,此序列就永久存在。