导读:bkeep
第一篇:基础篇
1,awk基本语法
2,比较操作符
3,复合表达式
4,next命令:
5,awk中的数字操作符:
6,awk中的赋值操作符
7,BEGIN和END
8,内置变量
9,awk使用shell变量
10,awk中的三种流控制语句
10.1 if语句
10.2 while语句:
10.3 for语句:
11. $0:
12,shell里的特殊变量
第二篇:准高级篇
1,内置函数
2, 输入输出的内部函数
3,借用C语言的格式化输出指令,
4,printf“%。。。”中的。。。有以下格式
5,gawk中的特殊字符:
6, 改变字段分隔符
7, 元字符
8, 调用gawk程序
9, 数组
10, 用户自定义函数
正文:
1,awk基本语法
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)-------或
说明一下:符合表达式必须用括号括起来
当使用&&时,expr1和expr2必须同时为零(零代表真!呵呵~),复合表达式才为真;
当使用||时,expr1和expr2只要有一个为真,复合表达式则为真!
4,next命令:
告诉awk跳过剩下的所有模式和表达式,并读取输入的下一行,同时从第一个模式或表达式开始处理该行!
5,awk中的数字操作符:
+加
-减
*乘
/除
%求余
^求幂
6,awk中的赋值操作符
+=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
7,BEGIN和END
awk的语法:/pattern/ {action}pattern:模式
这里pattern有两个特殊模式BEGIN和END
下面是BEGINEND的语法:
awk ‘
BEGIN { actions }
/ pattern / { actions }
/ pattern / { actions }
END { actions }
‘files
BEGIN和END都是可选的
·当指定BEGIN模式时,awk在读取任何输入前执行动作actions
·当指定END模式时,awk在其退出前执行动作actions
这里要特别注意:比如awk读入aa.txt。那么BEGIN只在读入aa时执行一次,然后按行处理的时候不再执行BEGIN指定的action!(也可以这么理解:BEGIN只对文件生效,而不是按行生效!!);理解了BEGIN,END还会糊涂吗?呵呵!
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
此程序会将所有用户的登录名称,依照字母的顺序显示出来。
9,awk使用shell变量
经过前面的学习,我们知道shell变量的引用由$xxx实现,而awk中的变量直接使用xxx来引用。所以我们就要思考如何让awk使用shell变量
语法:
awk‘script’awkvar1=valueawkvar2=value ......files
说明:awk:命令;‘script’:awk将要执行的脚本;awkvarN:awk的变量;value:shell中的变量值;files:将要处理的文件名
10,awk中的三种流控制语句
if语句
while语句
for语句
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
while (expression) { actions }
若expression为真,则执行actions
[root@master bkeep]# awk 'BEGIN { x=0;while(x<3) {x+=1;print x;}}'//先给x+1再输出
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
awk使用变量0原原本本地存储它所读入的整个输入行。这样可以保持和原来文本格式相同的输出
12,shell里的特殊变量
# 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为0、RLENGTH为- 1。
sprintf ( format,expression1,. . . )和printf类似,但是sprintf并不显示,而是返回字
sub ( regexp,replacement,target )在字符串target中寻找符合regexp的最长、最靠左的地方,以字串replacement代替最左边的regexp。
·gsub(regexp,replacement,target)与前面的sub类似。在字符串target中寻找符合regexp的所有地方,以字符串replacement代替所有的regexp。例如:
substr(string,start,length)返回字符串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 "%5slikes this language\n",$2}' testfile
10 likes this language
90 likes this language
110 likes this language
%5是定义$2列的输出占5个字符的位置
\n是换行符
printf是C语言的格式化输出
4,printf “%。。。”中的。。。有以下格式
d显示十进制的整数。
i显示十进制的整数。
e将浮点数以科学记数法的形式显示。
f将数字以浮点的形式显示。
g将数字以科学记数法的形式或浮点的形式显示。数字的绝对值如果大于等于0.0001则
o显示无符号的八进制整数。
s显示一个字符串。
x显示无符号的十六进制整数。1 0至1 5以a至f表示。
X显示无符号的十六进制整数。1 0至1 5以A至F表示。
%它并不是真正的格式控制字符,% %将显示%。
5,gawk中的特殊字符:
你也可以使用一些换码控制符格式化整行的输出。之所以叫做换码控制符,是因为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匹配。
|表示“或”。
*表示字符的零到多次重复。
+表示字符的一次到多次重复。
{a,b}表示字符a次到b次之间的重复。//没有成功!
表示字符零次和一次的重复。
[]表示字符的范围。
[^]表示不在[ ]中的字符。
8,调用gawk程序
# gawk–fscriptfilename
# 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
11011121.1111
99091929.99999
11 110 111 112111.1111
Timzhengbin 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