从文件行中提取数字模式

时间:2016-05-17 05:38:50

标签: bash design-patterns awk sed extract

我的文件格式如下:

 EDouble entry for scenario XX AAA 70337262003 Line 000000003350
 EDouble entry for scenario XX AAA 70337262003 Line 000000003347
 EDouble entry for scenario XX AAA 71375201001 Line 000000003353
 EDouble entry for scenario XX AAA 71375201001 Line 000000003351
 EDouble entry (different date/time) for scenario YY AAA 10722963407 Line   000000000447
 EDouble entry for scenario YY AAA 55173006602 Line 000000002868
 EDouble entry (different date/time) for scenario YY AAA 60404822801 Line 000000003285

我想要做的是基本上剥离所有字母字符并输出包含以下内容的文件:

70337262003
70337262003
71375201001
71375201001
10722963407
55173006602
60404822801

我已经想到了几种可以帮助我实现这一目标的方法,只是列出了一些想法,因为我没有现成的解决方案。我可以用以下内容删除所有字母字符:

tr -d '[[:alpha:]]'

但这仍然意味着我需要进一步处理文件以将第一个数字与第二个数字分开。 Sed可能提供更简单的解决方案,因为第二个数字总是以0开头。

  sed -n 's/.*\[1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1- 9]\).*/\1/p'

找到模式,只打印模式 - 但上面的命令不输出任何内容。有人可以帮帮我吗?没有必要用sed完成这个,我想用gsub和grep有类似的东西吗?

5 个答案:

答案 0 :(得分:2)

打印第三栏到最后一栏:

awk '{print $(NF-2)}' file

输出:

70337262003
70337262003
71375201001
71375201001
10722963407
55173006602
60404822801

答案 1 :(得分:2)

所以如果您更喜欢sed,请使用:

sed -rn "s@.*([1-9][0-9]{10}).*@\1@p" file.txt

答案 2 :(得分:1)

使用grep,您可以执行此操作:

grep -o '[1-9][0-9]\{10\}' file

使用sed:

sed -n 's/.*\([1-9][0-9]\{10\}\).*/\1/p' file

针对11位数的误差幅度很小,因为从0开始的数字长度为12位。考虑到这一事实,一个更强大的解决方案是:

sed -n 's/.*[[:blank:]]\([1-9][0-9]\{10\}\).*/\1/p' file

即确保在号码前匹配[[:blank:]]

答案 3 :(得分:1)

我看到AAA在数字后面的所有行中都是常量。

因此你可以使用它:

$ grep -oP '(?<=AAA\s)\s*\d+' data
70337262003
70337262003
71375201001
71375201001
10722963407
55173006602
60404822801

答案 4 :(得分:1)

这个数字提取一组数字后跟一个单词边界,但后面跟不是行的结尾:

$ grep -Po '\d+\b(?!$)' infile
70337262003
70337262003
71375201001
71375201001
10722963407
55173006602
60404822801
  • -P启用Perl正则表达式
  • -o仅保留匹配
  • \d+\b贪婪地匹配数字后跟字边界
  • (?!$)是&#34;否定前瞻&#34;:如果下一个字符是该行的结尾,则不匹配