Chinaunix首页 | 论坛 | 博客
  • 博客访问: 363700
  • 博文数量: 102
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 1116
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-29 16:21
文章分类

全部博文(102)

文章存档

2014年(10)

2011年(1)

2008年(2)

2007年(89)

我的朋友

分类:

2007-04-24 15:38:35

1、  语法格式:

awk  程序  文件名,程序形如:模式{动作}

       awk一次一行地读入文件名中的输入,依次与每个模式比较,对匹配的行执行相应的操作,和sed

   一样,并不改变输入文件的内容。awk中的程序也可以来自命令文件,如

      awk –f 命令文件  文件名

 

2、  字段

   awk自动将每个输入行分成字段,即由空格或者Tab分隔的非空格字符串。

   awk称这些字段为$1$2、...、$NF,其中NF的值被设置为字段的个数。注意NF$NF的差别,前者指字段的个数,后者指最后一个字段。不同于shellawk中只有字段是以$开始,变量是不加修饰的。

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

       

       符号~表示与正则表达式匹配,!~的意义是不匹配,正则表达式本身被包括在两个斜杠内。

        Lengthawk的内部函数,它得到字符串的长度。可以在模式前加!,使其变反。

       另外其他的内部函数如substr功能类似于C中的同名函数。

 

5、  注释

遵循shell规则,以#标识注释部分。

 

6、  BEGINEND模式

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循环,breakcontinue语句,这些都同于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命令,因此,一旦启动,此序列就永久存在。

 

 

阅读(1217) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~