本文共 1996 字,大约阅读时间需要 6 分钟。
【问题描述】
会员提供的信息中,有些手机号是会员随意输入的,因此要统计出有效的手机号。
如以下信息:
1 2 3 4 5 6 7 8 9 10 11 12 | 18295089368 1895089368 185089368 182089368 17888888888 17884432254 17888132435 17812266688 18295089368 18235089368 13335508387 15575089368 |
【解决办法】
利用grep,sed与awk结合正则即可。下面分别说明这三个的用法。
1.grep
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | root@network test $ egrep '^1[3578][0-9]{9}' test .txt 18295089368 17888888888 18295089368 18235089368 13335508387 15575089368 root@network test $ grep -oP '(?<=' ')(1[3578]{1}[0-9]{9})(?=' ')' test .txt 18295089368 17888888888 18295089368 18235089368 13335508387 15575089368 |
2.sed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | root@network test $ sed -n '/1[3578]\{1\}[0-9]\{9\}/p' test .txt 18295089368 17888888888 18295089368 18235089368 13335508387 15575089368 root@network test $ sed -rn '/1[3578]{1}[0-9]{9}/p' test .txt 18295089368 17888888888 18295089368 18235089368 13335508387 15575089368 |
3.awk
1 2 3 4 5 6 7 | root@oldboy test $ awk --posix '/1[3578]{1}[0-9]{9}/' test .txt 18295089368 17888888888 18295089368 18235089368 13335508387 15575089368 |
注;以上的awk中的--posix启用后就支持间隔表达式了,即r{n},r{n,},r{n,m}
然后说一下个性化需求。
1.如查找含有连续两个8的手机号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | root@network test $ grep -E '1[3578]{1}.*[8]{2}.*' test .txt 17888888888 17884432254 17888132435 17812266688 root@network test $ sed -rn '/1[3578]{1}.*[8]{2}.*/p' test .txt 17888888888 17884432254 17888132435 17812266688 root@network test $ awk --posix '/1[3578]{1}.*[8]{2}.*/' test .txt 17888888888 17884432254 17888132435 17812266688 root@network test $ grep '[8]\{2\}' test .txt 17888888888 17884432254 17888132435 17812266688 |
2.查找末尾是两个8的手机号
1 2 3 4 5 6 7 8 9 10 11 | root@network test $ grep -E '1[3578]{1}[0-9]{7}[8]{2}' test .txt 17888888888 17812266688 root@network test $ sed -rn '/1[3578]{1}[0-9]{7}[8]{2}/p' test .txt 17888888888 17812266688 root@network test $ awk --posix '/1[3578]{1}[0-9]{7}[8]{2}/' test .txt 17888888888 17812266688 |