打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【awk】awk语法(小结)

【awk】awk语法(小结)

Shell编程 2010-05-25 11:04:45 阅读644 评论0 字号:

导读:bkeep

第一篇:基础篇 

1awk基本语法 

2,比较操作符

3,复合表达式

4next命令:

5awk中的数字操作符:

6awk中的赋值操作符

7BEGIN    END

8,内置变量 

9awk使用shell变量

10awk中的三种流控制语句

10.1 if语句

10.2 while语句:

10.3 for语句:

11. $0

12shell里的特殊变量

第二篇:准高级篇

1,内置函数

2 输入输出的内部函数

3,借用C语言的格式化输出指令,

4printf %。。。”中的。。。有以下格式

5gawk中的特殊字符:

6 改变字段分隔符

7 元字符

8 调用gawk程序

9 数组

10 用户自定义函数

 

正文:

 

第一篇:基础篇

1awk基本语法

awk ‘script’  files

script 由下面的结构组成 /pattern/{actions}

2,比较操作符

语法:expression {actions;}

expression 可以使用以下操作符构成

<                                 小于

>                                 大于

<=                               小于等于

>=                               大于等于

==                               等于

!=                               不等于

value ~ /pattern/          value匹配pattern则为真

value !~ /pattern/         value不匹配pattern则为真

说明:$2 ~ /^\$[1-9][0-9]*  将匹配第二列以$开头,然后大于1的二位数。(注意,这里是1而不是10

3,复合表达式

语法:(compound expression

expr1&& (expr2)  -------

expr1|| (expr2)  -------

说明一下:符合表达式必须用括号括起来

当使用&&时,expr1expr2必须同时为零(零代表真!呵呵~),复合表达式才为真;

当使用 || 时,expr1expr2 只要有一个为真,复合表达式则为真!

4next命令:

告诉awk跳过剩下的所有模式和表达式,并读取输入的下一行,同时从第一个模式或表达式开始处理该行!

5awk中的数字操作符:

+           

-            

*           

/            

%           求余

^            求幂

6awk中的赋值操作符

+=                 x+=1 就是x=x+1

-=                  x-=1 就是x=x-1

*=                 x*=1 就是x=x*1

/=                  x/=1 就是x=x/1

%=                x%=2 就是x=x%2

^=                 x^=2 就是x=x^2

7BEGIN    END

awk的语法:/pattern/ {action}    pattern:模式

这里pattern有两个特殊模式BEGINEND

下面是BEGIN  END的语法:

awk ‘

BEGIN { actions }

/ pattern / { actions }

/ pattern / { actions }

END { actions }

  files

 

BEGINEND都是可选的

·当指定BEGIN模式时,awk在读取任何输入前执行动作 actions

·当指定END模式时,awk在其退出前执行动作actions

 

这里要特别注意:比如awk读入aa.txt。那么BEGIN只在读入aa时执行一次,然后按行处理的时候不再执行BEGIN指定的action!(也可以这么理解:BEGIN只对文件生效,而不是按行生效!!);理解了BEGINEND还会糊涂吗?呵呵!

 

8,内置变量

gawk语言中有几个十分有用的内置变量,现在列于下面:

NR 已经读取过的记录数。

FNR 从当前文件中读出的记录数。

FILENAME 输入文件的名字。

FS 字段分隔符(缺省为空格)。

RS 记录分隔符(缺省为换行)。

OFMT 数字的输出格式(缺省为% g)。

OFS 输出字段分隔符。

ORS 输出记录分隔符。

NF 当前记录中的字段数。

如果你只处理一个文件,则NR FNR 的值是一样的。但如果是多个文件, NR是对所有的文件来说的,而FNR 则只是针对当前文件而言。

改变内置变量的方法?

# awk 'BEGIN {FS=":"} {print $1 |"sort"}' /etc/passwd

adm

apache

avahi

此程序会将所有用户的登录名称,依照字母的顺序显示出来。

 

9awk使用shell变量

经过前面的学习,我们知道shell变量的引用由$xxx 实现,而awk中的变量直接使用xxx来引用。所以我们就要思考如何让awk使用shell变量

语法:

awk  ‘script’  awkvar1=value  awkvar2=value ......  files

说明: awk 命令; script’:awk将要执行的脚本; awkvarNawk的变量;valueshell中的变量值; files:将要处理的文件名

10awk中的三种流控制语句

if语句

while语句

for语句

10.1 if语句

if (expression1) {action1}

else if (expression2) {action2}

else { action3}

执行过程:

1)计算expression1的值

2)若expression1为真,执行action1并推出if语句

3)若expression1为假,计算expression2

4)若expression2为真,执行action2并退出if语句

5)若expression2为假,执行action3并退出if

 

10.2 while语句:

while (expression) { actions }

expression为真,则执行actions

[root@master bkeep]# awk 'BEGIN { x=0;while(x<3) {x+=1;print x;}}'   //先给x+1再输出

 

10.3 for语句:

for initialize_counter; test_counter;increment_counter {

     action

}

解释一下,呵呵

for (初始化计数器变量;测试计数器是否到顶了;增加计数器的值)  {

   要执行的动作!

}

 

【常用】

循环迭代处理记录中的域并输出他们

[root@master bkeep]# cat for2.sh

#!/bin/bash

awk '{

    for (x=1;x<=NF;x+=1) {

      printf "%s    ",$x "zbb";

    }

    printf "\n";

}' fruit_prices.txt

11. $0

awk使用变量0原原本本地存储它所读入的整个输入行。这样可以保持和原来文本格式相同的输出

12shell里的特殊变量

# sh /usr/local/bkeep/shell.sh 001 002

I'm $0 is:/usr/local/bkeep/shell.sh         //正在被执行脚本的名字;`basename $0`

I'm $1 is:001                 //$1接收到的参数

I'm $2 is:002                 //$2接收到的参数

I'm $# is:2                    //总共接收到的参数个数

I'm $* is:001 002          //把接收到的参数全部打印出来

I'm $@ is:001 002         //同上

I'm $? is:0                    //上一个脚本的退出状态“0代表正常;“1非正常退出

I'm $$ is:24137             //当前执行脚本的进程ID

I'm $! is:                      //前一个后台进程的id

 

第二篇:准高级篇

1,内置函数

length(string) 求出string 有几个字符。

match ( string,regexp ) 在字符串string 中寻找符合regexp 的最长、最靠左边的子字

符串。返回值是regexp string 的开始位置,即index值。match 函数将会设置系统变量

RSTART 等于index的值,系统变量RLENGTH 等于符合的字符个数。如果不符合,则会

设置R S TA RT 0RLENGTH - 1

sprintf ( formatexpression1. . . ) printf 类似,但是sprintf 并不显示,而是返回字

sub ( regexpreplacementtarget ) 在字符串target 中寻找符合regexp 的最长、最靠左的地方,以字串replacement 代替最左边的regexp

·gsub(regexpreplacementtarget)与前面的sub类似。在字符串target中寻找符合regexp的所有地方,以字符串replacement代替所有的regexp。例如:

substr(stringstartlength)返回字符串string的子字符串,这个子字符串的长度为

length,从第start个位置开始。

tolower(string) 将字符串string的大写字母改为小写字母。

toupper(string) 将字符串s t r i n g的小写字母改为大写字母。

 

2 输入输出的内部函数

close(filename) 将输入或输出的文件filename 关闭。

system(command) 此函数允许用户执行操作系统的指令,执行完毕后将回到gawk

 

3,借用C语言的格式化输出指令,

可以让gawk的输出形式更为多样。这时,应该用printf而不是print。例如:

# gawk '$1 != "Tim" {printf "%5s likes this language\n",$2}' testfile

   10 likes this language

   90 likes this language

  110 likes this language

%5是定义$2列的输出占5个字符的位置

\n 是换行符

printfC语言的格式化输出

4printf “%。。。中的。。。有以下格式

d 显示十进制的整数。

i 显示十进制的整数。

e 将浮点数以科学记数法的形式显示。

f 将数字以浮点的形式显示。

g 将数字以科学记数法的形式或浮点的形式显示。数字的绝对值如果大于等于0.0001

o 显示无符号的八进制整数。

s 显示一个字符串。

x 显示无符号的十六进制整数。1 01 5af表示。

X 显示无符号的十六进制整数。1 01 5AF表示。

% 它并不是真正的格式控制字符,% %将显示%

5gawk中的特殊字符:

你也可以使用一些换码控制符格式化整行的输出。之所以叫做换码控制符,是因为gawk对这些符号有特殊的解释。下面列出常用的换码控制符:

a 警告或响铃字符

b 后退一格

f 换页

n 换行

r 回车

t Ta b

v 垂直的t a b

验证一下\a,运行后“当”了一声,呵呵,有意思!

# gawk '{printf "%5s works for %10s and earns %6f an hour\n\a",$1,$2,$5 }' testfile

6 改变字段分隔符

# awk -F "," '{print $1,$2,$3}' aa

7 元字符

^ 表示字段的开始。

$ 表示字段的结束。

. 表示和任何单字符m匹配。

| 表示“或”。

* 表示字符的零到多次重复。

+ 表示字符的一次到多次重复。

{ab} 表示字符a次到b次之间的重复。  //没有成功!

表示字符零次和一次的重复。

[] 表示字符的范围。

[^] 表示不在[ ]中的字符。

8 调用gawk程序

# gawk  –f  script  filename

# gawk  –f script  -F";"  filename

# gawk -f script filename1 filename2 filename3 ...

9 数组

gawk语言支持数组结构。数组不必事先初始化。声明一个数组的方法如下:

arrayname[num]=value请看下面的例子:

# cat reverse.sh

#!/bin/bash

{line[NR] = $0 } # remember each line

END {var=NR # output lines in reverse order

while (var > 0){

print line[var]

var--

}

}

10 用户自定义函数

下面详细解释一下自定义的function函数

# cat function.sh

#!/bin/bash

{print "sum=",SquareSum($1,$2)} //这行是awk最终执行的动作(调用我们自定义的函数)

                                                 //这里把栏位1和栏位2的值分别赋予x,y变量

function SquareSum(x,y){    //function是关键字,SquareSum是自定义函数名,

//x,y是自定义函数的参数列表

sum=x*y+y*y        //函数真正的功能:先相乘再相加,最后返回sum值!

return sum

}

# cat testfile

1  10  11  12  1.1111

9  90  91  92  9.99999

11 110 111 112  111.1111

Tim  zhengbin bkeep tom

# cat function.sh

#!/bin/bash

{print "sum=",SquareSum($1,$2)}

function SquareSum(x,y){

sum=x*y+y*y

return sum

}

# awk -f function.sh testfile

sum= 110

sum= 8910

sum= 13310

sum= 0

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
gawk实用程序
[转帖]Linux\awk 简明教程
linux命令终极系列(awk
Unix awk使用手册
linux 文本编辑命令grep sed awk(转) - linux开发 - gliet...
AWK使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服