我希望打印一个包含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 9090876534\n
答案 0 :(得分:2)
是的,它在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
9090876534\n
因此,最好使用开头^
和行尾$
字符来匹配完全 10个数字中包含的字段:
$ awk '/[0-9]{10}/ {for (i=1;i<=NF;i++) if ($i ~ /^[0-9]{10}$/) print $i}' n
9898664511
7788992121
7665544213
来自The GNU Awk User’s Guide → 3.3 Regular Expression Operators:
<强> {N} 强>
<强> {N,} 强>
<强> {N,M} 强>
大括号内的一个或两个数字表示区间表达式。如果大括号中有一个数字,则前面的正则表达式重复n次。如果有两个数字用逗号分隔,则前面的正则表达式重复n到m次。如果有一个数字后跟逗号,则前面的正则表达式至少重复n次:
wh{3}y
匹配'whhhy',但不是'why'或'whhhhy'。
wh{3,5}y
仅匹配'whhhy','whhhhy'或'whhhhy'。
wh{2,}y
匹配'whhy','whhhy'等等。
传统上awk中没有区间表达式。它们作为POSIX标准的一部分添加,使awk和egrep相互一致。
最初,因为旧程序可能在regexp常量中使用'{'和'}',所以gawk与regexp中的区间表达式不匹配。
但是,从版本4.0开始,gawk默认情况下匹配间隔表达式。这是因为与POSIX的兼容性对于大多数gawk用户来说比与旧程序的兼容性更重要。
对于在regexp常量中使用“{”和“}”的程序,最好始终使用反斜杠转义它们。然后regexp常量是有效的,并且使用任何版本的awk.16以你想要的方式工作。
最后,当'{'和'}'以不能被解释为区间表达式(例如/ q {a} /)的方式出现在regexp常量中时,它们就代表了它们。