今天写了shell脚本,主要目的是将uniq过滤的数据,在次过滤下,原数据中是些ip的访问记录,一行一个ip,想将访问的ip重复的过滤,使用了sort|uniq -c,过滤了重复的数据,并将每一个ip的访问次数写在前面,显示的格式是以下:shell
4 192.168.1.3spa
1 102.173.2.1ip
3 123.71.43.6it
获得这个结果后,想将次数小于2次的数据提取出来,开始以为很简单,直接一个for in $(cat ip.txt)循环,在取第一个值,进行判断,<2的将ip提出来追加到另一个文件中,结果文件中保存的都是次数,不是ip,查了下资料,发现若是输入文本中包括空格或制表符,则不是换行读取,line在输入文本中按空格分隔符或制表符或换行符特环取值,解决方法:能够经过把IFS设置为换行符来达到逐行读取的功能.io
OLDIFS=$IFSfor循环
IFS=$'\n'class
for i in $(cat ip.txt)效率
...awk
IFS=$OLDIFSList
可是由于文件太大分析的速度太慢了,使用awk来过滤发现速度比读取每行过滤效率提升的多,方法:使用cat $1 |awk '{if($1<'$2'){printf $2} printf "\n" }'过滤符合条件的文件,结果在去掉空行。
这种方法不用for循环,不用设置IFS,并且执行效率比for强的不少,awk很牛!!!