awk是一个强大的linux 自带工具 用于分析文件 日志,由java转awk 还是有点困难的 下边我们一点一点尝试
假如有一个文件 test 是这样子的 我想要去里边8月7号的null 要怎么操作呢
20170809|demo0754|%22%3anull|^test
20170807|demo0754|%22%3anull|^test
20170807|demo0754|%22%3anull|^test
首先 取得0807这一样 awk /0807/ test 就可以了
取null 要进行两步切分
第一步 awk -F '\%22\%3' '{print $2}' test 意思是 把$22%3a作为分隔符 对正行进行切分 获得两个部分,只取第二部分所以用 $2(特殊符号必须转义\)
第二部 对$2按照|^进行切分取第一步 awk -F ‘\|\^’ '{print $1}'
然后把三个awk 串起来
awk /0807/ test | awk -F '\%22\%3' '{print $2}' | awk -F ‘\|\^’ '{print $1}' 所得的结果就是null
接下来进行一个新的需求 要统计null的个数
那么就要用到sort 和uniq 和wc 了
上边的方法改写成
awk /0807/ test | awk -F '\%22\%3' '{print $2}' | awk -F ‘\|\^’ '{print $1}' | sort -r | uniq -c | wc -l
为什么要排序呢?那是因为如果不排序 就会去重得不彻底 同样的字段 linux会认为是不同的 解决方法就是加上sort
uniq是唯一的意思 这里用作去重
wc 是统计行数的意思