仅从文件中提取电话号码

时间:2014-04-04 15:08:24

标签: regex linux file unix grep

我确定这个问题的答案已经在线,但我不知道我在找什么。我刚刚开始学习Unix / Linux课程,我爸爸让我为他的工作做点什么。他有一个文本文件,每隔四行就有一个10位数字。我如何列出数字列表?我假设文件看起来像这样:

Random junk
Random junk fake number 1234567809
Random junk
My phone number is 1234567890 and it is here random numbers 32131;1231
Random junk
Random junk another fake number 2345432345
Random junk
Just kidding my phone number is here 1234567890 the date is mon:1231:31231

我假设它像grep [1-9].\{9\}文件,但我如何得到第4,8,12行等等。因为我测试了它,我得到了每一行的所有电话号码。另外,我如何获得数字而不是整行?

任何帮助都将受到高度赞赏,即使它指向正确的方向,所以我可以自己研究。感谢。

5 个答案:

答案 0 :(得分:6)

您可以分两步完成:

$ awk '!(NR%4)' file | grep -Eo '[0-9]{10}'
1234567890
1234567890
  • awk '!(NR%4)' file打印数量为4的倍数的行。与说awk '(NR%4==0) {print}' file相同。
  • grep -Eo '[0-9]{10}'打印10个块上显示的数字。请注意-o用于“只打印匹配”,-E用于使用扩展正则表达式。

或者

$ awk '!(NR%4)' file | grep -Eo '[1-9][0-9]{9}' #check if first number is <>0

答案 1 :(得分:1)

使用GNU sed

sed -nr '0~4{s/.*\b([0-9]{10})\b.*/\1/p}' inputfile

0~4从第0行开始每隔4行产生一次,即产生文件中的每4行。替换部分相当明显。

对于您的样本输入,它会产生:

1234567890
1234567890

答案 2 :(得分:1)

由于您每行都在寻找一个数字,因此解决方案将涉及

awk '!(NR%4) && match($0, /[[:digit:]]{10}/){print substr($0, RSTART, RLENGTH)}' file

答案 3 :(得分:1)

使用perl

$ perl -nle 'print /([0-9]{10})/ if !($.%4)' file
1234567890
1234567890

答案 4 :(得分:0)

要解决此问题,首先,您应该知道电话号码的长度。您还应该考虑代码识别的区号以及可能的电话号码起始号码。这样,您将只过滤最可能的真实数字。但如果我写'#34;我的电话号码是028 2233 5674 ......开玩笑吧,它是028 2233 9873。&#34;然后代码会认为这两个数字都是正确的。所以,要完全解决这个问题,如果文本中有假数字,几乎是不可能的。但是智能代码会过滤那些最可能正确的代码。