【问题描述】
会员提供的信息中,有些手机号是会员随意输入的,因此要统计出有效的手机号。
如以下信息:
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
|
本文转自 xoyabc 51CTO博客,原文链接:http://blog.51cto.com/xoyabc/1725659,如需转载请自行联系原作者