我有一个带行的文件,其中一些行包含电话号码,这些号码都有10个号码,但格式不同。例子:
00 00 00 00 00
00.00.00.00.00
00000-00000
0-0000-00000
(000)000-0000
我只需找到带有电话号码的行并打印出来。为了让人更加困惑,有IP adresses的行不应该被打印出来:( 我该怎么做?
答案 0 :(得分:2)
egrep '([0-9].*){10}' file.txt | egrep -v '(^|[ \t])[0-9]{1,3}(\.[0-9]{1,3}){3}([ \t]|$)'
第一个正则表达式查找其中包含10位数的行,忽略所有其他字符。第二个正则表达式过滤掉IP地址。这两个正则表都是粗糙的,但基本的想法是存在的。根据需要调整它们。
(例如,第一个,将允许数字之间的任何字符;您可能只想允许某些符号和空格。第二个将过滤掉看起来像IP地址但无效的内容,如{{1 }}。)
答案 1 :(得分:1)
此示例仅打印包含电话号码的每一行的匹配部分。它会在性能方面进行交易,因为它可以通过每行的所有过滤器进行交易:
#!/bin/bash
while read line
do
while read filter
do
egrep -o "$filter" <<<"$line"
done <<FILTERS
([0-9]{2}[ \.]){4}[0-9]{2}
[0-9]{5}-[0-9]{5}
[0-9]-[0-9]{4}-[0-9]{5}
[\(][0-9]{3}[\)][0-9]{3}-[0-9]{4}
FILTERS
done < "$1"
这个例子仍然可读,但没有显示第一个的性能缺点:
FILTERS="
([0-9]{2}[ \.]){4}[0-9]{2}
[0-9]{5}-[0-9]{5}
[0-9]-[0-9]{4}-[0-9]{5}
[\(][0-9]{3}[\)][0-9]{3}-[0-9]{4}
"
# replace newlines with '|',
FILTERS=$( tr "
" "|" <<<"$FILTERS" )
# surround result with '(' and ')':
FILTERS="(""$FILTERS"")"
while read line
do
egrep -o "$FILTERS" <<<"$line"
done < "$1"
答案 2 :(得分:0)
使用正确的perl模块 - 仅限美国的电话号码:
perl -MNumber::Phone -nlE 'say $_ if Number::Phone->new('US', $_)'
从下一个输入
00 00 00 00 00
00.00.00.00.00
00000-00000
0-0000-00000
(000)000-0000
(320)234-4565
32023-44565
12042345678
2042345678
1(201)2345678
201-23-45-678
+421-934-4354
1 242 555 0199
1 246 555 0199
1 264 555 0199
1 268 555 0199
1 284 555 0199
1 340 555 0199
1 345 555 0199
1 441 555 0199
1 473 555 0199
1 649 555 0199
+441234567890
打印
(320)234-4565
32023-44565
2042345678
201-23-45-678
下一个代码:
perl -MNumber::Phone::Country -nlE 'say "$_:\t",phone2country($_)'
打印:
00 00 00 00 00: NANP
00.00.00.00.00: NANP
00000-00000: NANP
0-0000-00000: NANP
(000)000-0000: NANP
(320)234-4565: US
32023-44565: US
12042345678: CA
2042345678: CA
1(201)2345678: US
201-23-45-678: US
+421-934-4354: SK
1 242 555 0199: BS
1 246 555 0199: BB
1 264 555 0199: AI
1 268 555 0199: AG
1 284 555 0199: VG
1 340 555 0199: VI
1 345 555 0199: KY
1 441 555 0199: BM
1 473 555 0199: GD
1 649 555 0199: TC
+441234567890: GB