检查文件下第二列是否有重复,且有几行是重复的,并提取出重复的行的第二列 实际工作中是上百万行,列也比这多,这里只是列出一小部分而已,具体如下:cnyunwei.log 0920762613004 367707175433 0635 0921702423002 508705309115 1035 0922450613006 328209142523 5063 0927310523001 518207014922 1035 0920910523002 538510242124 6035 0920910613004 538311101228 1035 0921980613015 327806305726 1635 0922262313001 458706080015 1033 0920012313004 518306272410 9065 0926470213015 518207014922 5635 0925112313002 138512110026 1035 0928030613003 128601150031 1357 0927340123001 538311101228 1035 0926471413002 518803249270 8065 0926550523002 448706043468 1035 200908565489 148705080622 2083 200910633424 427703083341 1183 709101202008 138512110026 1035 0933001263450 337904124727 4258 709108057002 13801126122X 1335 709200077043 338905250343 1035 0933001251479 138512110026 5258 709213077016 338912128329 1035 709213072032 338612152326 1335 709213072002 338705158523 1935 709214077003 339001015682 1035 ==>> 以下两种方法可以达到同样的效果 awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c | grep -v "1 " awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c | awk '{if($1>1){print $0}}' 执行后的结果: 2 538311101228 2 518207014922 3 138512110026 注: awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c ==>> 意思是提取出第二列并过滤重复,且列出重复行数 扩展一下,把以上结果所在行整行内容取出==>> 把上面取出的结果临时存于temp.log文件中,再读取这个文件来取原文件里的整行内容 awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c | grep -v "1 " | awk '{print $2}' >> temp.log 或 awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c | awk '{if($1>1){print $0}}' | awk '{print $2}' >> temp.log ==>> vi cnyunwei.sh #!/bin/sh SOCFILENAME=cnyunwei.log FILENAME=temp.log if [ -e $FILENAME ]; then rm -rf $FILENAME fi awk -F " " '{print $2}' $SOCFILENAME | sort -r | uniq -c | grep -v "1 " | awk '{print $2}' >> $FILENAME while read LINE do grep $LINE $SOCFILENAME done < $FILENAME exit 0 更简单的方法合并成一行命令搞定: awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c | awk '{if($1>1){print $0}}' | awk '{print $2}' | while read output;do grep $output cnyunwei.log; done 都是工作中的实战Shell,大家回帖补充完善! (责任编辑:IT) |