Linux下利用awk进行文本统计

最近做了许多日志文件的统计工作,发现awk这个东西用来处理文本真是太强大了,结合sed和sort命令应付日常的文本统计工作
非常之方便 ,下面是我这段时间对awk的学习理解和常用的命令:

1. awk的命令格式:
awk命令是由模式和操作组成的(两者是可选的):
pattern {action} 如awk $1~/(\.jpg|\.gif)$/' access.log,或awk 'length($1) < 10' click.log。
如果没有模式,则action应用到全部记录,
如果没有action,则输出匹配模式的全部记录。
默认情况下,每一个输入行都是一条记录,但我们可以通过RS变量指定不同的行分隔符进行一行的定义。
    1.1 模式,可以是正则表达式,也可以是关系表达式,在表达式前面用~和~!分别表示匹配和不匹配后面的模式
         BEGIN:指定在第一条记录被处理之前所进行的工作
         END:指定在最后一条记录被处理之后所进行的工作
    1.2 操作,由一个或多个命令、函数、表达式组成,操作需要用大括号{}包含,这里面就是对文本要进行处理的逻辑

2. awk的环境变量(常用):
    $0 完整的一行记录
    $n 当前记录的第n个字段
    ARGV 命令行参数数组
    FS 字段分隔符,默认是空格或tab,可以自己指定
    NR 当前记录数
    NF 当前记录的字段数
    RS 一行记录的分隔符,默认是换行符

3. 文本处理常用命令:
    3.1 所有第1列相同的行,按第2列的和,求和的结果倒序输出(类似SQL中的group by求sum())
        awk '{arr[$1]+=$2}END{for (i in arr) print i,arr[i]}' src.txt  | sort -k2nr -g > dest.txt
    3.2 文件分割,每100万行分成一个文件
        awk '{if (NR<1000000) print $0 >"file01";if (NR>=1000000) print $0>"file02"}' src.txt
        当然,分割文件还有一个更方便的工具split,split -b1000m src.txt output_prefix (按大小来分割)
    3.4 统计第一列的值出现的次数,结果倒序输出(类似SQL中的group by求count())
        awk -F "," '{ w[$1]+=1} END{ for (a in w)  print a, w[a]}' src.txt  > dest.txt
    3.5 删除重复的行
        awk '!a[$0]++' src.txt > dest.txt (也可以指定$x来删除第x列重复的行)
    3.6 字符串连接
        awk 'length($1) > 0 {var="insert into user_info values("$1")";print var}' src.txt > dest.sql
    3.7 比较两列
         awk '{max = {$1 > $3} ? $1: $3: print max}' src.txt
以上就是一些常用的awk命令,主要是用于文本的统计,另外,awk还内置了很多函数,包括时间函数、数学函数和字符串函数,
可以方便地直接引用。
更详细的awk手册,请参考:http://man.lupaworld.com/content/manage/ringkee/awk.htm

-->枪声依旧<--

posted on 2012-01-15 17:28 枪声依旧 阅读(10286) 评论(0)  编辑  收藏 所属分类: Linux


只有注册用户登录后才能发表评论。


网站导航:
 
<2012年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

搜索

最新评论

阅读排行榜

评论排行榜