我确信这个问题的答案已经在网上,但我不知道我在寻找什么。我剛開始了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。然后代码会将这两个数字视为正确。因此,要完全解决这个问题,如果文本中有假数字,几乎是不可能的。但是一个智能代码,会过滤那些最有可能正确的代码。