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]
[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 socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍