awk的使用

20150508.log中的内容为
2015-05-08 01:21:03 登录失败,登录用户:xxx 错误密码:xxx,登录IP:183.25.191.120
2015-05-08 06:37:29 登录失败,登录用户:xxx 错误密码:xxx,登录IP:36.47.207.51
2015-05-08 07:44:07 登录失败,登录用户:xxx 错误密码:xxx,登录IP:58.33.6.48
2015-05-08 07:44:17 登录失败,登录用户:xxx 错误密码:xxx,登录IP:58.33.6.48
2015-05-08 07:44:27 登录失败,登录用户:xxx 错误密码:xxx,登录IP:58.33.6.48
2015-05-08 07:44:44 登录失败,登录用户:xxx 错误密码:xxx,登录IP:58.33.6.48


1.搜索以2015-05-08 11:32:开头的行
awk '/^2015-05-08 11:32:/' 20150508.log
2.搜索以121.61.183.2结尾的行
awk '/121.61.183.2$/' 20150508.log
3.搜索含有nanhongsoufun28的行
awk '/nanhongsoufun28/' 20150508.log
4.打印以IP: 分割的第二个域
awk -F "IP:" '{print NR "------" $2}' 20150508.log
5.使用awk内置变量
awk -F "IP:" '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' 20150508.log
6.使用printf
awk -F "IP:" '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' 20150508.log
7.计数器的使用
awk -F "IP:" '{count++;print $2;} END{print "count is ", count}' 20150508.log
初始化 awk -F "IP:" 'BEGIN {count=0;} {count=count+1;print $2;} END{print "count is ", count}' 20150508.log
8.统计ip出现的次数
awk -F "IP:" '{a[$2]++;} END{for (j in a) print a[j],j;}' 20150508.log
9.和原文件顺序一致的统计
awk -F "IP:" '{a[$2]++;if(!b[$2]++)c[++j]=$2;} END{for(i=0;i++<j;) print c[i],a[c[i]];}' 20150508.log
10.取前10个 
awk -F "IP:" '{a[$2]++;if(!b[$2]++)c[++j]=$2;} END{for(i=0;i++<j;) print c[i],a[c[i]];}' 20150508.log | head -n 10
11.常见的几个宏
RS ( 输入记录之间的分隔符 )Records Seperator.
ORS ( 输入出记录之间的分隔符 )Output Records Seperator.
FS (输入记录中,每个域之间的分隔符)Fields Seperator.
OFS (输出记录中,每个域之间的分隔符)Output Fields Seperator.
NR (当前已经读的记录数)Number of Records read so far.
NF (当前记录中域的个数)Number of Fields in current record.
ARGC 传入的参数的个数
ARGV 传入的参数的数组
FILENAME 传入参数的文件的名字
awk '{print NR, NF, ARGC,ARGV[0], ARGV[1], ARGV[2],FILENAME, FNR}' 20150508.log 
1 4 2 awk 20150508.log  20150508.log 1
2 4 2 awk 20150508.log  20150508.log 2
3 4 2 awk 20150508.log  20150508.log 3
4 4 2 awk 20150508.log  20150508.log 4
12.内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。
可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:\t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。
输出域的分隔符默认是一个空格,保存在OFS中。如$ awk -F: '{print $1 OFS $2}' 20150508.log,$1和$2间就是OFS的值
eg:awk -F "IP:" 'BEGIN {OFS="|";} {print $1 OFS $2}' 20150508.log
13.显示20150508.log文件第2列中以116.113开头的行
awk  -F "IP:" '$2 ~/^116.113/' 20150508.log 
显示20150508.log文件第2列中不以116.113开头的行
awk  -F "IP:" '$2 !~/^116.113/' 20150508.log | head -n 2
14.查看前100个进程名称中含有root进程
ps aux | awk '{print $1}'|head -100 |grep root
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值