首页 > 代码库 > awk命令之基础篇

awk命令之基础篇

基本命令

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 设置匹配时是否忽略大小写
ENVIRONUNIX环境变量
ERRNOUNIX系统错误消息
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


awk命令之基础篇