基本命令
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
关于字段:
awk命令会读入的每一行分割成多个字段,每一字段是由指定或默认分隔符分开,默认的分隔符是tab和空格,可以用$1,$2,等的形式访问对应字段,字段都是从1开始的,而$0表示整个行
内置变量
$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]; }' sky123
重定向
awk '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语句,则终止脚本的执行。
BEGIN和END
awk ' BEGIN { action } /pattern/ { action } END { action } ' 输入文件
awk ' BEGIN{print "begin"} /张三/{print $0} END{print "end"} ' tmp begin 1,张三,60 end
if:
if (condition1) { action1 } else if (condition2) { action2 } else { action3 }
awk 'BEGIN{ if(FNR==1) print 1; else print 2; }' 2
while
while(condition){ action3 }
awk 'BEGIN{a=1; while(a<5){ a++; if(a>3) break; } print a; }' 4
for
for(变量 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
do{ action3 }while(condition)
awk 'BEGIN{a=1; do{ a++; }while(a<5) print a; }' 5
时间: 2024-11-05 19:37:35