我想打印一个可以包含10位手机号码的文件中的所有列
我尝试了:
awk '/[0-9]{10}/{for(i=1;i<=NF;++i)if($i~/[0-9]{10}/)print $i}' filename
但是这个sems无法正常工作。
我只想使用Awk
做例如,文件中的文本
named 9898664511 nameb n
namea nameb namec 7788992121 n
namec named 7665544213 named n
namea namec namef nameg namek 9090876534n
是的,它在gnu awk中确实如此!只是您不必逃脱它们:
$ awk 'BEGIN{v=10; if (v~/10{2}/) print "yes"}'
$ awk 'BEGIN{v=100; if (v~/10{2}/) print "yes"}'
yes
因此,您的正则表达方式应该是这样:
/[0-9]{10}/
鉴于您的样品输入,它将产生以下内容:
$ awk '/[0-9]{10}/ {for (i=1;i<=NF;i++) if ($i ~ /[0-9]{10}/) print $i}' n
9898664511
7788992121
7665544213
9090876534n
因此,使用开始^
和行末端$
字符的结尾可能是一个好主意,将这些字段匹配恰好 10个数字:
$ awk '/[0-9]{10}/ {for (i=1;i<=NF;i++) if ($i ~ /^[0-9]{10}$/) print $i}' n
9898664511
7788992121
7665544213
来自GNU AWK用户指南→3.3正则表达操作员:
{n}
{n,}
{n,m}
括号内的一个或两个数字表示间隔表达式。如果牙套中有一个数字,则重复前面的regexp n次。如果有两个数字被逗号隔开,则将前面的REGEXP重复为N到M次。如果有一个数字后面是逗号,则至少n次重复前面的regexp:
wh{3}y
匹配" whhy",但不匹配"为什么"或" whhhy"。
wh{3,5}y
仅匹配" whhy"," whhhy"或" whhhhy"。
wh{2,}y
匹配" hhy"," whhy"等等。
间隔表达式在传统上不可用。它们被作为POSIX标准的一部分添加,以使尴尬和EGREP彼此一致。
最初,因为旧程序可以在Regexp常数中使用" {"one_answers"}",所以Gawk与Regexps中的间隔表达式不匹配。
但是,从版本4.0开始,GAWK默认情况下确实匹配了间隔表达式。这是因为与POSIX的兼容性对大多数Gawk用户而言比与旧程序的兼容性更重要。
对于在Regexp常数中使用" {"one_answers"}"的程序,最好始终以后斜切逃脱它们。然后,Regexp常数是有效的,并使用任何版本的awk.16
按照您想要的方式工作。最后,当'{''和'}'以无法解释为间隔表达式(例如/q {a}/)的方式出现在Regexp常数中时,它们就为自己代表自己。