最近做了许多日志文件的统计工作,发现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还内置了很多函数,包括时间函数、数学函数和字符串函数,
可以方便地直接引用。
-->枪声依旧<--