仅从文件中提取电话号码



我确信这个问题的答案已经在网上,但我不知道我在寻找什么。我剛開始了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 行等。因为我测试了它,我得到了每条线上的所有电话号码。另外,我如何只获得数字而不是整行?

任何帮助将不胜感激,即使它为我指明了正确的方向,所以我可以自己研究它。谢谢。

您可以通过两个步骤完成:

$ 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

使用 GNU sed

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

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

对于示例输入,它将生成:

1234567890
1234567890

由于您要查找每行一个数字,因此awk解决方案将涉及

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

使用 perl

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

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

相关内容

  • 没有找到相关文章

最新更新