使用awk心得整理

前段时间用AWK处理文本生成报表,用起来非常不错。在这里做个记录。
AWK擅长于文本处理和报表生成,有许多精心设计的特性,允许进行多种方式的编程,一旦学会,将给大家带来新的数据处理体验。

AWK 总结 1 1、方式&结构 1 2、行&列匹配与正则表达式 2 2.1行匹配 2 2.2列匹配 2 3、if判断 循环(break,continue) 运算符 2 4、特殊符号 3 5、数组&内建函数 3 6、自定义函数和作用域 4 7、解决作用域 技巧 4

1、方式&结构

1、awk 'BEGIN{} {} END{}' $file //直接在命令行中 2、[root@node91 xie]# vi test.awk //把awk脚本写入文件 !/bin/awk BEGIN{ //(注意)BEGIN 和 { 必须在同一行 FS=":"; } { print $1; } END{ //(注意)END 和 { 必须在同一行 } [root@node91 xie]# echo | awk -f test.awk $file //执行awk脚本处理来处理$file

AWK代码结构

BEGIN块初始化, {} 主题代码 END块用与最终输出以及汇总操作

示列 //$_下标

awk 'BEGIN{FS=":" ; i=0} {i+=1;print $1} END{ print "--->",i,"lines" }' /etc/passwd

2、行&列匹配与正则表达式 2.1行匹配 》awk 'BEGIN{} /root/{print $0} END{}' /etc/passwd 等价于 》awk 'BEGIN{} $0~/root/{print $0} END{}' /etc/passwd
root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 2.2列匹配 》 awk 'BEGIN{FS=":"} $1~/root/{print $0} END{}' /etc/passwd //正则表达式 root:x:0:0:root:/root:/bin/bash 》 awk 'BEGIN{FS=":"} $1=="root"{print $0} END{}' /etc/passwd //选取某一列相等 root:x:0:0:root:/root:/bin/bash 》awk 'BEGIN{FS=":"} ($1=="root") &&($2=="x"){print $0} END{}' /etc/passwd //多个判断 root:x:0:0:root:/root:/bin/bash 写成文件 !/bin/awk BEGIN{FS=":" } ($1=="root") &&($2=="x") { //(注意)这里必须在同一行,awk更想JAVA的打花括号方式 print $0 } END{ }

3、if判断 循环(break,continue) 运算符 if awk 'BEGIN{FS=":"} {if($0~/root/ && $1=="root"){print $0}} END{}' /etc/passwd root:x:0:0:root:/root:/bin/bash for awk 'BEGIN{FS=":"} {print $0 ; for(i=0;i<3;i++){print "\n"}} END{}' /etc/passwd //每行打印三个空行 do_while awk 'BEGIN{} {print $0;i=0;do{ print "\n" ;i ++ }while(i<3) } END{}' /etc/passwd while awk 'BEGIN{} {print $0;i=0;while(i<3){ print "\n" ;i ++ }} END{}' /etc/passwd 运算符 awk 'BEGIN{i="0"} { i++;print i} END{}' /etc/passwd //awk 做数学运算时,把能够转化为数字的字符串做转化,不能的转化为0

4、特殊符号 FS 字段分隔符 awk 'BEGIN{i="t";FS=":"} { i++;print NF} END{}' /etc/passwd NF 字段数目 awk 'BEGIN{i="t";FS=":"} { i++;print NF} END{}' /etc/passwd NR 第几行 awk 'BEGIN{i="t";FS=":"} { i++;print NR} END{}' /etc/passwd RS 记录分隔符变量 默认为\n cat /etc/passwd | xargs
cat /etc/passwd | xargs | awk 'BEGIN{RS="nologin"} {print "---"$0} {}'
OFS 打印逗号代替符 echo "" | awk 'BEGIN{OFS="---YES---"} {print "1","2"} END{}' ORS,全称是“输出记录分隔符" echo "" | awk 'BEGIN{ORS="\n\n" ; OFS="---YES---"} {print "1","2";print "3",4} END{}'

5、数组&内建函数 数组 !/bin/awk BEGIN{ months["Jan"]="01";months["Feb"]="02"; months["Mar"]="03";months["Apr"]="04"; months["May"]="05"; months["Jun"]="06"; months["Jul"]="07";months["Aug"]="08"; months["Sep"]="09";months["Oct"]="10"; months["Nov"]="11";months["Dec"]="12"; } { for(i in months){ print i," --->",months[i]; }

内建函数 awk 'BEGIN{FS=":"} {print "length->",length($0);print "index->",index($0,"root");print toupper($0) } END{}' /etc/passwd

6、自定义函数和作用域 自定义函数 echo | awk 'BEGIN{} function test(){ for(i=0;i<5;i++){print "------",i}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}'

echo | awk 'BEGIN{} function test(){ for(j=0;j<5;j++){print "------",j}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}'

7、解决作用域 技巧

利用函数参数局部化 echo | awk 'BEGIN{} function test(i){ for(i=0;i<5;i++){print "------",i}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}'

如果x,y是输入参数呢? echo | awk 'BEGIN{} function test(x,y,i){ for(i=0;i<5;i++){print "------",i}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}'

技巧,加个标识隔开 echo | awk 'BEGIN{} function test(x,y,_END,i){ for(i=0;i<5;i++){print "------",i}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}' 多个AWK文件?

转载于:https://my.oschina.net/u/177808/blog/180983

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值