| awk‘{action}‘ 输入文件 | 无条件执行action |
| awk ‘/pattern/{action}‘ 输入文件 | pattern匹配时执行action |
| awk ‘(condition){action}‘ 输入文件 | condition成立时执行action |
awk '/李四/{print $0}' tmp//输出含有‘李四’关键字的一行记录
2 李四 70
awk '/^2/{print $0}' tmp//输出以2开头的一行记录
2 李四 70
| $0 | 当前的一行记录 |
| $1~$n | 当前记录的第n个字段,字段间由FS分隔 |
| FS | 输入字段分隔符,默认是空格 |
| RS | 输入记录分隔符,默认为换行符 |
| OFS | 输出字段分隔符 默认也是空格 |
| ORS | 输出记录分隔符,默认为换行符 |
| NF | 当前记录中的字段个数 |
| FNR | 处理过的文件行数,仅限当前文件 |
| NR | 处理过的文件行数,多个文件累加 |
| ARGC | 命令行参数个数 |
| ARGV | 命令行参数数组 |
| FILENAME | 当前输入文件的名字 |
| IGNORECASE | 设置匹配时是否忽略大小写 |
| ENVIRON | UNIX环境变量 |
| ERRNO | UNIX系统错误消息 |
| CONVFMT | 数字到字符串的转换格式 |
| OFMT | 设置数字的输出格式 |
| RSTART | 被匹配函数匹配的字符串首 |
| RLENGTH | 被匹配函数匹配的字符串长度 |
| FIELDWIDTHS | 输入字段宽度的空白分隔字符串 |
| ARGIND | 当前被处理文件的ARGV标志符 |
tmp文件内容有:id,name,score
awk '{print FILENAME,ARGC,ARGV[0],ARGV[1]}' tmp
tmp 2 awk tmp
awk -F ',' '{print NF,FS,FNR,FS,NR,RS}' tmp tmp
ps:-F,指定逗号为字段分隔符
3 , 1 , 1
3 , 1 , 2
awk '{print ENVIRON["PATH"]}' tmp
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
awk '{CONVFMT="%f";printf "%s\n",0.11}' tmp
0.110000
awk '{OFMT="%0.2f";print 1/3}' tmp
0.33
awk '{match("tmp123tmp", /123/); print RSTART,RLENGTH}' tmp
4 3| =,+=,-=,*=,/=,%=,^= | 赋值语句 |
| || | 逻辑或 |
| && | 逻辑与 |
| ~ ~! | 匹配正则表达式和不匹配正则表达式 |
| <,<=,>,>=,!=,== | 关系运算符 |
| +,-,*,/, | 加减乘除 |
| **,^ | 求幂 |
| ! | 逻辑非 |
| ++,-- | 自增,自减 |
| $ | 字段引用 |
| 空格 | 字符串连接符 |
| ?: | C条件表达式 |
| in | 数组中是否存在某键值 |
in ?:
awk 'BEGIN{a[1];a[2];print 1 in a?"存在":"不存在"}'
存在
正则匹配:
awk -F "," '{if($3~/70/) printf "%s score %d\n",$2,$3}' tmp
李四 score 70
幂:
awk -F "," '{tmp=$3^2;if(tmp>=6400) printf "%s score %d\n",$2,$3}' tmp
王五 score 80
空格:
awk 'BEGIN{print "1" "2"}'
12
awk 'BEGIN{print "1","2"}'
1 2
awk的数组是一组键值对,数组的下标可以是数字和字母,值和关键字都存储在内部的一张针对key/value应用hash的表格里。
awk 'BEGIN{
a[z]="sky123";
print a[z];
}'
sky123awk 'BEGIN{print "1" >> "1.txt"}' | cat 1.txt
1
ls |awk 'FS==" "{print 1}'
1
break 当 break 语句用于 while 或 for 语句时,导致退出程序循环。continue当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。next能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。exit使主输入循环退出并将控制转移到END(如果END模块存在的话)。如果没有定义END模块,或在END中应用exit语句,则终止脚本的执行。
awk '
BEGIN { action }
/pattern/ { action }
END { action }
' 输入文件awk '
BEGIN{print "begin"}
/张三/{print $0}
END{print "end"}
' tmp
begin
1,张三,60
endif (condition1) {
action1
} else if (condition2) {
action2
} else {
action3
}
awk 'BEGIN{
if(FNR==1) print 1;
else print 2;
}'
2
while(condition){
action3
}awk 'BEGIN{a=1;
while(a<5){
a++;
if(a>3) break;
}
print a;
}'
4for(变量 in 数组){
action3
}
for(变量;condition;expression){
action3
}
awk 'BEGIN{
a[1]=100;
a[2]=200;
a[3]=300;
for(i in a){
if(i==2) continue;
print a[i];
}
}'
100
300
awk 'BEGIN{
a[1]=100;
a[2]=200;
a[3]=300;
for(i=1;i<=3;i++){
if(i==3) exit;
print a[i];
}
}'
100
200
do{
action3
}while(condition)
awk 'BEGIN{a=1;
do{
a++;
}while(a<5)
print a;
}'
5原文地址:http://blog.csdn.net/zsp_skyer/article/details/39580365