码迷,mamicode.com
首页 > 其他好文 > 详细

awk命令之基础篇

时间:2014-09-26 20:06:18      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:awk   shell   linux   

基本命令

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


awk命令之基础篇

标签:awk   shell   linux   

原文地址:http://blog.csdn.net/zsp_skyer/article/details/39580365

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!