`
webcode
  • 浏览: 5911917 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

awk编程初级篇

 
阅读更多
awk是一种非常优秀的文本处理语言,尤其对于日志分析及报表处理。本文将对自己学习awk的一些经验分享给大家。
初识awk
$ awk '{print}' 2012_02_02.request.log  ---- 该命令将2012_02_02.request.log文件中的内容输出。
$ awk '{print $0}' 2012_02_02.request.log ---- 与上述命令完全一样,用于输出该文件的内容。$0命令表示当前行。
$ awk '{print ""}'  /etc/passwd ---- 输出空格
$ awk '{print ”helloworld"}' /etc/passwd  ---- 将在每行都输出helloworld

多个字段
awk善于处理分成多个逻辑字段的文本,而且可以方便的引用到分解完后的各个字段的数据。
$ awk -F":" '{print $1}' /etc/passwd  ---- 按照:进行分割,并输出分割后的第一个值;
-F ---- 表示按照某个字符进行分隔;
$ awk -F":" '{print $1 $3}' /etc/passwd ---- 按照:进行分割,输出分割后的第1个值及第3个值,值与值之间是相连的。
$ awk -F":" '{print $1" "$3}' /etc/passwd ---- 按照:进行分割,输出分割后的第1个值及第3个值,而且值与值之前有空格分隔。
$ awk -F":" '{print "username:" $1 "\tuid:"$3}' /etc/passwd  ---- 按照:进行分隔,输出第1个值及第3个值,在输出时加入一些内容。

外部脚本
当然有时直接在屏幕上输入多行命令会较为复杂,我们可以通过编程的方式将awk的一些命令集写在一个文件中通过外部调用的方式来完成多条复杂命令的执行,完成相关的功能。外部脚本的引用通过:
$ awk -f ****.awk myfile.data
-f表示调用外部脚本并执行。

BEGIN和END块
awk会执行每个编程块一次,当然有时候在处理文本之前可能需要先对文本进行处理,可以将预先需要的处理放置在BEGIN块中;或者在文本处理完成后,需要输出统计结果,则可以将输出结果放置在 END块中。如
BEGIN { END {
FS=":"; print count;
} }

规则表达式 -- / /
awk允许使用规则表达式,根据规则表达式是否匹配当前行来选择执行独立代码块。
/root/ '{print}' ---- 当该行中含有root这个关键词时才匹配输出;
它还提供了一些特殊的匹配方式,如"==", "<", ">", "<=", ">=", "!=", "~", "!~"
其中"~"与"!~"分别表示匹配与不匹配。即运算符左边的变量是否包含右边规则表达式中的值。
$ awk -F":" '{if($1 ~ /root/) print}' /etc/passwd ----表示的是按:分隔后的第一个字符串中包含root字符串的再输出
$ awk '{if($0 == /^$/) ++count}  END {print count}' /etc/passwd ---- 输出该文件中含有多少个空白行。

字段分隔符 -- FS
在前面介绍过程中,有了解到可以通过-F":"的方式来设置当前字段的分隔符。当然也可以采用其它的方式来进行设置,如:
FS = ":" ----通过FS也可以方便的进行设置;
FS = "\t+" ----通过FS配置规则表达式的方式也可以进行分隔,如上述即通过一个或多个tab空白进行分割。

字段数量 -- NF
对于一个统计文本,由于其中按照某个分割符分开后,其字段数并不确定,通过NF命令即可统计出每行含有多少个字段数量。
$ awk '{print NF}' /etc/passwd ---- 输出该文本中所包含的每条记录按空格分割后的字段数量;

记录号 -- NR
包含当前记录的编号(将第一条记录算做记录号1)。NR还会告诉你当前的行号。
$ awk '{if(NR > 1 && NR <=20) print}' /etc/passwd ---- 输出该文本中2-20行的所有记录。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics