awk的实例(来自鸟哥的私房菜)

awk主要用于数据处理,相比于sed不同的是,sed对文件进行行的处理,awk则是通过将行进行分割来对其各字段进行处理。

awk命令里面用『‘{}’』(一对单引号再加上置于里面的一对大括号)来进行标明需要处理的字符串。

这里需要用到printf的格式化输出工具,其实这个和C里面的printf()函数用法基本一致,只是格式更加自由一点,具体的google一下。


(1)先看一个简单的用法:

$ last | grep 'Fri' | awk '{printf $1 "\t" $3}'

#这个命令是将最近一次在星期五登陆的情况显示出来,并用到了awk和printf


(2)看看几个变量:

$1  :列出每一行的帐号(位于第一列)

NR  :列出目前处理的行数

NF  :说明该行有多少字段

FS  :目前的分隔字符,默认为空格键,可通过赋值更改。

用法:

$ last | grep 'Fri' | awk '{printf $1 "\tlines"NR "\tcolumes:"NF "\n"}'

显示:fengxiaoke lines:1 columes:10

            fengxiaoke lines:2 columes:9

特别提示:最后一定要加上\n,不然输出的数据会是一整行,看着真的会是MASS,不利于数据分析,失去了使用awk的意义了。


(3)获取用户ID


#打印USER和UID

$ cat /etc/passwd | awk 'BEGIN{FS=":"}$3<10{printf $1"\t"$3 “\n”}'

#加上BEGIN之后,第一个用户root将正常显示,因为FS默认从第二行开始生效

#如果我们木有加上BEGIN的话,root行会显示:

#root:x:0:0:root:/root:/bin/bash

#显然这不应该是我们想要的,所以还是得加上BEGIN

#貌似还有一个END,可以google一下


(4)进行数据的加工处理


#数据处理
#假定我们有这么一个文档:pay.txt
#NAME 1st2nd3th
#VBird 200 300 400
#DMTsai 150 180 210
#Bird2 250 260 300
#我们要做的数据处理就是将每个人的收入相加得总和,添加各行最后对应位置并格式化输出

$ cat pay.txt | awk 'NR==1{printf "\t%s\t%s\t%s\t%s\t%s\n",$1,$2,$3,\
>$4,total}'NR>=2{total=$2+$3+$4 printf "\t%s\t%d\t%d\t%d\t%d\n",$1,$2,$3,\
>$4,total}

这样我们便能在原有文档的基础上得到每个人的工资总和了

你可能感兴趣的:(c,数据分析,user,Google,文档,工具)