Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42303
  • 博文数量: 8
  • 博客积分: 31
  • 博客等级: 民兵
  • 技术积分: 178
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-09 12:29
文章分类

全部博文(8)

文章存档

2014年(6)

2013年(1)

2012年(1)

我的朋友

分类: LINUX

2014-01-22 17:04:33

# cat awkTest.txt
mary:100:200
MARY:200:300
Jay:50:10
Tom:30:200
Mary:200:1000
 
awk的环境变量Table 1. awk的环境变量变量 描述
$n 当前记录的第n个字段,字段间由FS分隔。
$0 完整的输入记录。
ARGC 命令行参数的数目。
ARGIND 命令行中当前文件的位置(从0开始算)。
ARGV 包含命令行参数的数组。
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环境变量关联数组。
ERRNO 最后一个系统错误的描述。
FIELDWIDTHS 字段宽度列表(用空格键分隔)。
FILENAME 当前文件名。
FNR 同NR,但相对于当前文件。
FS 字段分隔符(默认是任何空格)。
IGNORECASE 如果为真,则进行忽略大小写的匹配。
NF 当前记录中的字段数。
NR 当前记录数。
OFMT 数字的输出格式(默认值是%.6g)。
OFS 输出字段分隔符(默认值是一个空格)。
ORS 输出记录分隔符(默认值是一个换行符)。
RLENGTH 由match函数所匹配的字符串的长度。
RS 记录分隔符(默认是一个换行符)。
RSTART 由match函数所匹配的字符串的第一个位置。
SUBSEP 数组下标分隔符(默认值是\034)。

1、在屏幕上打印”What is your name?",并等待用户应答。当一行输入完毕后,getline函数从终端接收该行输入,并把它储存在自定义变量name中。
 如果第一个域匹配变量 name的值,print函数就被执行,END块打印See you和name的值。
 awk 'BEGIN{printf "What is your name?"; getline name < "/dev/tty" } $1 ~name {print "Found " name " on line ", NR "."} END{print "See you," name "."}' test.txt
 
2、IGNORECASE忽略大小写,正确使用BEGIN,END和变量i  注:-F:可以在BEGIN中设定
 awk -F: 'BEGIN{i=0;print "NR Name  Num  Num"}{IGNORECASE=1;if($1=="mary"){print NR,$0;++i}} END{print "THE record num:"i}' awkTest.txt
 
3、使用split对某一域的值再进行分组:split($1,list,">"  使用>对第一域的值进行拆分生成数组list.
 cat config.xml.bak |awk '{split($1,list,">");for(i=0;i < length(list);i++){if(list[i]=="  
4、循环awk有三种循环:while循环;for循环;special for循环
 awk '{ i = 1; while ( i <= NF ) { print NF,$i; i++}}' test。
  变量的初始值为1,若i小于可等于NF(记录中域的个数),则执行打印语句,且i增加1。直到i的值大于NF.

 awk '{for (i = 1; i

 special for循环用于读取关联数组中的元素。格式如下:
  {for (item in arrayname){print arrayname[item]}}
  awk -F : '/^M/{name[NR]=$1}; END{for(i in name){print name[i]}}' awkTest.txt 打印有值的数组元素。打印的顺序是随机的。

 breadkcontinue语句。
  break用于在满足条件的情况下跳出循环;continue用于在满足条件的情况下忽略后面的语句,直接返回循环的顶端。
  如:{for ( x=3; x<=NF; x++) if ($x<0){print "Bottomed out!"; break}}
   {for ( x=3; x<=NF; x++) if ($x==0){print "Get next item"; continue}}
 next语句从输入文件中读取一行,然后从头开始执行awk脚本。如:
   {if ($1 ~/test/){next} else {print}}
  awk 'BEGIN{fs=":";print "NR Name Num";i=0}{if ($1 ~/^Mary/){print $0} else {next};i++}END{print "the record num:"i}' awkTest.txt

 exit语句用于结束awk程序,但不会略过END块。退出状态为0代表成功,非零值表示出错。

5、awk中的下标使用:数组name中的下标是一个自定义变量x,awk初始化x的值为0,在每次使用后增加1。
 第二个域的值被赋给name数组的各个元素。在END 模块中,for循环被用于循环整个数组,从下标为0的元素开始,打印那些存储在数组中的值。
 因为下标是关健字,所以它不一定从0开始,可以从任何值开始。
 awk -F: '{name[x++]=$2};END{for(i=0;i

6、用字符串作为下标。如:count["test"]
 用域值作为数组的下标。
 一种新的for循环方式,for (index_value in array) statement。
 如:awk -F: '{count[$2]++} END{for(name in count) print name,count[name]}' awkTest.txt
 该语句将打印$2中字符串出现的次数。它首先以第一个域作数组count的下标,第一个域变化,索引就变化。

7、系统时间
 时间函数systime函数返回从1970年1月1日开始到当前时间(不计闰年)的整秒数
 awk '{ now = systime(); print now }' awkTest.txt
 
 strftime函数使用C库中的strftime函数格式化时间
 awk -F: '{ now=strftime( "%D", systime() ); print now }' awkTest.txt
 awk -F: '{ now=strftime("%m/%d/%y"); print now }' awkTest.txt

 

阅读(1753) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~