您的位置:首页 > 运维架构 > Linux

awk 实例练习(二)

2016-07-01 22:47 525 查看
先来总结一下awk内置变量:

[align=left]ARGC          命令行参数个数[/align]
[align=left]ARGV          命令行参数排列[/align]
[align=left]ENVIRON       支持队列中系统环境变量的使用[/align]
[align=left]FILENAME      awk浏览文件名[/align]
[align=left]FNR           浏览文件的记录数[/align]
[align=left]FS            设置输入域分隔符,等价于命令行-F选项[/align]
[align=left]NF            浏览记录的域个数[/align]
[align=left]NR            已读的记录数[/align]
[align=left]OFS           输出域分隔符[/align]
[align=left]ORS           输出例句分隔符[/align]
[align=left]RS            控制记录分隔符[/align]
[align=left] [/align]
[align=left] [/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'{print NF,NR,$0} END {print FILENAME}' grade.txt
7 1 M.Tansley  
05/99   48311   Green   8       40      44
7 2 J.Lulu     
06/99   48317   green   9       24      26
7 3 P.Bunny    
02/99   48      Yellow  12      35      28
7 4 J.Troll    
07/99   4842    Brown-3 12      26      26
7 5 L.Tansley  
05/99   4712    Brown-2 12      30      28
[align=left]grade.txt[/align]
[align=left] [/align]

#使用 -F
参数指定分隔符

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ echo
$PWD
[align=left]/home/zhuyupeng[/align]
[align=left] [/align]
[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ echo
$PWD | awk -F/ '{print $NF"\t"NF}'
[align=left]zhuyupeng       3[/align]

#设置变量名,将27
赋值给变量BASELINE

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'BEGIN {BASELINE="27"} $6<BASELINE {print $0}' grade.txt
[align=left]J.Lulu  06/99   48317   green   9       24      26[/align]
[align=left]J.Troll 07/99   4842    Brown-3 12      26      26[/align]

[align=left]#修改数值域取值,注意‘{}’[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'{if($1=="M.Tansley") $6=$6-1; print $1,$6,$7}' grade.txt
[align=left]M.Tansley 39 44[/align]
[align=left]J.Lulu 24 26[/align]
[align=left]P.Bunny 35 28[/align]
[align=left]J.Troll 26 26[/align]
[align=left]L.Tansley 30 28[/align]

[align=left] [/align]

[align=left]#修改文本域取值[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'{if($1=="J.Troll") $1="J.L.Troll"; print $1}' grade.txt
[align=left]M.Tansley[/align]
[align=left]J.Lulu[/align]
[align=left]P.Bunny[/align]
[align=left]J.L.Troll[/align]
[align=left]L.Tansley[/align]

#创建新的输出域,这里新的输出域为
diff

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'BEGIN {print "Name \t Difference"} {if($6<$7) {diff=$7-$6; print $1,diff}}' grade.txt
[align=left]Name     Difference[/align]
[align=left]M.Tansley 4[/align]
[align=left]J.Lulu 2[/align]
[align=left] [/align]

#统计某一个域的和,使用‘+=’
下面的例子统计第六个域的和

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'(tot+=$6); END{print "Club student total points: " tot}' grade.txt
[align=left]M.Tansley       05/99   48311   Green   8       40      44[/align]
[align=left]J.Lulu  06/99   48317   green   9       24      26[/align]
[align=left]P.Bunny 02/99   48      Yellow  12      35      28[/align]
[align=left]J.Troll 07/99   4842    Brown-3 12      26      26[/align]
[align=left]L.Tansley       05/99   4712    Brown-2 12      30      28[/align]
[align=left]Club student total points: 155[/align]

[align=left]#注意区别,加‘{}’则不打印文件[/align]
[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'{(tot+=$6)}; END{print "Club student total points: " tot}' grade.txt
[align=left]Club student total points: 155[/align]

[align=left]awk 内置字符串函数[/align]
[align=left] [/align]
[align=left]gsub(r,s)          在整个$0中用s替代r[/align]
[align=left]gsub(r,s,t)        在整个t中使用s替代r[/align]
[align=left]index(s,t)         在返回s中字符串t的第一个位置[/align]
[align=left]length(s)          放回s长度[/align]
[align=left]match(s,r)         测试s是否包含匹配r的字符串[/align]
[align=left]split(s,a,fs)      在fs上将s分成序列a[/align]
[align=left]sprint(fmt,exp)    返回经fmt格式化后的exp[/align]
[align=left]sub(r,s)           用$0中最左边最长的子串代替s[/align]
[align=left]substr(s,p)        返回字符串s中从p开始的后缀部分[/align]
[align=left]substr(s,p,n)      返回字符串s中从p开始长度为n的后缀部分[/align]

[align=left] [/align]

[align=left]#替换,目标串使用正则表达式格式‘//’[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'gsub(/4842/,4899) {print $0}' grade.txt
[align=left]J.Troll 07/99   4899    Brown-3 12      26      26[/align]

[align=left] [/align]

[align=left]#查询字符串第一次出现的位置,注意使用BEGIN,否则每一行都会打印,字符串使用引号括起来[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'BEGIN{print index("Bunny","ny")}' grade.txt
[align=left]4[/align]
[align=left] [/align]

[align=left]#长度[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'$1=="J.Troll" {print length($1)" "$1}' grade.txt
[align=left]7 J.Troll[/align]

#match
使用: 找不到返回0,找到返模式串在匹配串中的位置,

[align=left]#注:单独使用 加BEGIN[/align]
[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'BEGIN {print match("ANCD",/d/)}'
[align=left]0[/align]

[align=left]#以下两种模式都正确[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'$1=="J.Lulu" {print match($1,"u")}' grade.txt
[align=left]4[/align]
[align=left] [/align]
[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'$1=="J.Lulu" {print match($1,/u/)}' grade.txt
[align=left]4[/align]

#split
返回字符串数组元素个数

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'BEGIN {print split("123#456#789",myarray,"#");print myarray[1],myarray[2],myarray[3]}'
[align=left]3[/align]
[align=left]123 456 789[/align]

[align=left]#sub,发现并替换模式的第一个位置[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'$1=="J.Troll" {sub(26,29,$0)} {print $0}' grade.txt
[align=left]M.Tansley       05/99   48311   Green   8       40      44[/align]
[align=left]J.Lulu  06/99   48317   green   9       24      26[/align]
[align=left]P.Bunny 02/99   48      Yellow  12      35      28[/align]
J.Troll 07/99   4842    Brown-3 12      29     
26
[align=left]L.Tansley       05/99   4712    Brown-2 12      30      28[/align]
[align=left] [/align]

[align=left]#substr,返回字符串指定范围内的子串[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'$1=="L.Tansley" {print substr($1,1,5)}' grade.txt
[align=left]L.Tan[/align]

[align=left]#使用substr返回指定位置开始的后缀部分,范围只给了一个参数,注意和上一个例子相对比[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
[align=left]$ awk '{print substr($1,3)}' grade.txt[/align]
[align=left]Tansley[/align]
[align=left]Lulu[/align]
[align=left]Bunny[/align]
[align=left]Troll[/align]
[align=left]Tansley[/align]

#从shell中向awk传递字符串,通过
echo 加管道的方式

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ echo
"Test" | awk '{print length($0)}'
[align=left]4[/align]

[align=left] [/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
[align=left]$ STR="mydoc.txt"[/align]
[align=left] [/align]
[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ echo
$STR | awk '{print substr($STR,7)}'
[align=left]txt[/align]
[align=left]
[/align]
[align=left]转自:http://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591842.html[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux awk 实例