awk精要总结

来源:互联网 发布:μvision是什么软件 编辑:程序博客网 时间:2024/06/12 03:11
1:
awk在shell中可以说不仅仅是一个工具,而是一门语言,下面简单介绍一下的语法和用法:

awk 的模式: awk 'BEGIN{actions} pattens{actions}...END{actions}' data_file : 

awk 每次从 data_file文件中取出一条记录(record)(默认是一行,如果设置了RS内置变量就可以修改),如果此record符合

pattens表达式的描述,就执行actions的动作,执行完所有的pattens{actions}后又重新取出record开始一样的匹配操作:

例如  awk ' $0 != "" {printf("$0")}' config.txt.

要注意的事项: 第一个“'”和awk字样有一个空格,后一个“'”和数据文件有一个空格,这样做是为了提示在shell中awk 程序的开始和结束.

BEGIN{actions}和END{actions}是两个特殊的pattens{actions}模型,他们分别是在awk程序开始处理record之前执行和awk处理完所有的record后运行一次。

BEGIN{actions}主要处理一些设置的工作如设置内置变量读取传进来的例如:

awk 'BEGIN

{

      FS = "|"

      RS = "\n"

      global_file = "\home\hostname\target_file"

      total = 0

}

{

       print $0

       total++

}

END 

{

      close(source_file)

      print total

}

' source_file

可以看到在awk 中的变量可以再等号两端有空格(shell要求不能有)有点类似于c语言如果将语句写在一行只需要在语句间用";"连起来

2:

关于pattens:

awk支持一下的表达式

3:

关于actions

4:

awk内置的字符处理函数

4.1:index(原字串,要寻找的字串):

若原字串中含有 要寻找的字串,返回该子串在原子串中第一次出现的位置,若未曾出现该子串返回0,位置以1开始。

4.2:length(字串)

返回字串的长度:如“hualu”返回5

4.3:match(原字串,用以寻找对比的正则表达式)

在原字串中寻找合乎 正则表达式的 子字串,若符合要求的 子字串 有多个 以最左端为准。找到子字串后会进行如下动作:

设定awk中的内置变量 RSTART, RLENGTH.

RSTART = 子字串子在原字串中出现的位置,为0表示未找到

RLENGTH = 子字串的长度,为-1表示未找到

例如:

awk ' BEGIN

{

      match("banana",/(an)+/)

      print RSTART, RLENGTH

}

结果:2 4

4.4:split(原字串,数组,分隔符号)

用指定的 分隔符号将原字串 分割并依此存储到数组中

4.5: printf()

和c中的一样

4.6: sub(用以对比的正则表达式,将替换的新字串,原字串)

将原字串中符合要求正则表达式描述的第一个子字串(最左端的)替换成 新字串,新字串可用"&"表示合乎条件的子字串,如果原字串没有给出默认为¥0

4.7: gsub()

用法和sub一样只是将原字串中满足条件的所有字串都替换掉

4.8:substr(字串,起始位置,长度)

返回从起始位置开始,指定长度的 子字串,若未指定长度返回 从起始位置开始到字串结束的子字串

5.

数学函数:

5.1:int(x)

返回x的整数部分(去掉小数)这个的用法,实际工作中有这么个情况,将文件中的有序列的数据按1000条分割成多个文件文件末尾表明里面的数据的情况,数据记录 如 order|name|selary

awk '

{    

     number = 1000 * (int($1/1000)+1)

     file = "target_"number

     printf("%s\n", $0) >file

}' source.file

5.2:rand()

返回介于0-1之间的随机数值

5.3:srand(x)

指定x为rand()函数起始种子

6.

awk的内建变量

argc, argv,FILENAME,

FS(field separator): 栏分割符

RS(record separator):记录分隔符

NR(number record):awk程序运行到目前为止读取的 记录数

FNR:和NR相似,当读取一个新文件时,FNR置为0

NF(number field):目前的数据行所切分的栏数

OFS:输出时 栏分割符,默认是“ ”,在print中如果 print  "nihao","lvjian" 则两个之间加上OFS

ORS:输出时的 记录分隔符

7.

正则表达式

^ :行首匹配,该字符串必须出现于行手

$ :行末匹配,该字符串必须出现于行尾

[...]:和shell中的相同

[^...]:和shell中的相同

*:前面的字符可出现0次或多次

+:awk特有,前面的字符可出现一次或多次

?:前面的字符可出现1次或不出现

~:匹配,字串~/正则表达式/ :表示字串中如何有字串符合正则表达式的描述就匹配,注意这里不是要求字串符合正则表达式的描述。只要其字串匹配就算成立

!~:不匹配

8.

actions主要由一下指令组成:

8.1:表达式

8.2:printf,print 表达式列表

8.3:if 语句 

if()

{}

else

{}

8.4:while两种形式

while()

{

    语句

}


do

{

     语句

}while

8.5:for语句,有两种形式

for (a in array) 

{

     语句

}


for (表达式;判断;循环动作)

{

     语句

8.6: break 和c相同,跳出循环

8.7: continue 和c相同

8.8:next

执行next指令时,awk略过其后的所有指令包含以后所有的pattens{actions}接着读取下一条记录开始第一个模型的匹配

8.9exit

退出awk程序














0 0