FS:分隔符,FS="\t+" +表示一个或多个前一个字符,FS=“foo[0-9][0-9][0-9]”表示foo后面加3位数字分割
OFS:输出时每列的分隔符
NF:当前行中的字段数量
NR:当前行号
RS:分行符,默认为\n
ORS:输出记录分隔符,即为print语句结尾自动打印的字符
awk '{print "jim","tom","lilei"}' /etc/passwd 输出N多行 jim tom lilei,print中的列以“,”区分,输出结果中默认的列分隔符为空格“ ”;
awk 'BEGIN{OFS="--"} {print "jim","tom","lilei"}' /etc/passwd 将输出N多行的jim--tom--lilei,因为在BEGIN中将输出时的列分隔符设置为了--。
例子:address.txt文件内容如下:
Jimmy the Weasel
100 Pleasant Drive
San Francisco, CA 12345
Big Tony
200 Incognito Ave.
Suburbia, WA 67890
address.awk :
BEGIN{
FS="\n"
RS=""
OFS="--"
ORS="\n\n"
}
{
print $1, $2, $3
}
awk -f address.awk address.txt
结果为:
Jimmy the Weasel--100 Pleasant Drive--San Francisco, CA 12345
Big Tony--200 Incognito Ave.--Suburbia, WA 67890
address.awk的作用:以"\n"即回车分列符,""空行为分行符对address.txt进行解析,输出时的列分隔符为--,行记录的分隔符为“\n\n”即2个回车
2.循环结构
do{}while(),doWhile.awk
{
s=1
do{
print "the s is:" s
s++
}while(s<3)
}
for ,for.awk
{
for(i=1;i<3;i++){
print "the s is:" s
}
}
while循环,while.awk
{
s=1
while(s<3){
print "the s is :" s
s++
}
}
break和continue语句和c语句功能类似
3. 数组
awk的数组下标通常从1开始,array01.awk
{
myarray[1]="jim"
myarray[2]="123"
for(x in myarray){
print myarray[x]
}
}
其中x为myarray的下标,先遍历哪一个是无序的,即结果可能是 jim 123,也可能是123 jim
awk支持字符串下标,array02.awk
{
myarray["name"]="jim"
myarray["age"]="123"
for(x in myarray){
print "myarray[" x "]="myarray[x]
}
}
查找数组中的特定下标元素可以用“in”布尔运算符,如:if("age" in myarray)
4.格式化输出
printf(),sprintf()类似于C语言中的格式化输出。printf()会把格式化的字符串打印到stdout,而sprintf()返回格式化字符串可以赋值给变量
{
x=1
b="boo"
printf("%s got a %d on the last test\n","Jim",56)
myout=sprintf("%s--%d",b,x)
print myout
}
5.字符串函数 length(str),index(src,des),tolower(str),toupper(str),substr(src,index,len),match(src,regexp),sub/gsub(regexp,replstring,mystring),split(mystring,array,spit)
strFunc.awk
{mystring="naDTTdd you dni hao aaa you,kdnf90dd((((kdjfn"
print "mystring=" mystring
print "length(mystring)=" length(mystring)
print "index(mystring,\"you\")=" index(mystring,"you")
print "index(mystring,\"aaA\")=" index(mystring,"aaA")
print "tolower(mystring)=" tolower(mystring)
print "toupper(mystring)=" toupper(mystring)
print "substr(mystring,9,3)="substr(mystring,9,3)
print "match(mystring,/you/),RSTART,RLENGTH=" match(mystring,/you/),RSTART,RLENGTH
print "sub(/you/,\"YOU\",mystring)="sub(/you/,"YOU",mystring)
print "mystring=" mystring
nums=split(mystring,myarray," ")
print myarray[1],myarray[nums]
}
结果为:
mystring=naDTTdd you dni hao aaa you,kdnf90dd((((kdjfn
length(mystring)=45
index(mystring,"you")=9
index(mystring,"aaA")=0
tolower(mystring)=nadttdd you dni hao aaa you,kdnf90dd((((kdjfn
toupper(mystring)=NADTTDD YOU DNI HAO AAA YOU,KDNF90DD((((KDJFN
substr(mystring,9,3)=you
match(mystring,/you/),RSTART,RLENGTH=9 9 3
sub(/you/,"YOU",mystring)=1
mystring=naDTTdd YOU dni hao aaa you,kdnf90dd((((kdjfn
naDTTdd you,kdnf90dd((((kdjfn