Regex“^[[:位:][$”;在AWK/GAWK中未按预期工作

Regex“^[[:位:][$”;在AWK/GAWK中未按预期工作,awk,gnu,gawk,character-class,Awk,Gnu,Gawk,Character Class,我在RHEL上的呆滞版本是: gawk-3.1.5-15.el5 我想打印一行,如果它的第一个字段有所有数字(没有特殊字符,甚至需要考虑空格) 这里出了什么问题?我的AWK版本不理解GNU字符类吗?请帮助匹配[[:digit:]字符类中的多个数字添加一个+,这意味着匹配$1中的一个或多个数字 echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]+)$/) print $0}' 123456789012345,3 这符合你的

我在RHEL上的呆滞版本是:

gawk-3.1.5-15.el5
我想打印一行,如果它的第一个字段有所有数字(没有特殊字符,甚至需要考虑空格)


这里出了什么问题?我的AWK版本不理解GNU字符类吗?请帮助

匹配
[[:digit:]
字符类中的多个数字添加一个
+
,这意味着匹配
$1
中的一个或多个数字

echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]+)$/)  print $0}'
123456789012345,3
这符合你的要求

一种更惯用的方法(如评论中所建议的)是删除
打印
,并在行中包含直接匹配项并打印出来

echo "123456789012345,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
123456789012345,3
还有一些例子证明了这一点

echo "a1,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
(及)

不要按照要求生产任何输出a

另一种符合POSIX的方法可以通过如下方式实现严格的数字长度检查,其中,
{3}
表示匹配长度

echo "123,3" |  awk --posix -F, '$1 ~ /^[0-9]{3}$/'
123,3
(及)

不产生任何输出

如果您使用的是相对较新版本的
bash
shell,那么它支持一个本机
regEx
操作符,并使用上面的
POSIX
字符类

#!/bin/bash

while IFS=',' read -r row1 row2
do
   [[ $row1 =~ ^([[:digit:]]+)$ ]] && printf "%s,%s\n" "$row1" "$row2"
done < file
while IFS=',' read -r row1 row2
do
   [[ -z "${row1//[0-9]/}" ]] && printf "%s,%s\n" "$row1" "$row2"
done < file
剧本产生了

$ bash script.sh
122,12
虽然这是可行的,
bash regEx
可能会慢一些,但使用字符串操纵的相对直接的方法类似于

#!/bin/bash

while IFS=',' read -r row1 row2
do
   [[ $row1 =~ ^([[:digit:]]+)$ ]] && printf "%s,%s\n" "$row1" "$row2"
done < file
while IFS=',' read -r row1 row2
do
   [[ -z "${row1//[0-9]/}" ]] && printf "%s,%s\n" "$row1" "$row2"
done < file
当IFS=','read-r第1行第2行时
做
[[-z“${row1//[0-9]/}”]&&printf“%s,%s\n”“$row1”“$row2”
完成<文件

“${row1//[0-9]/}”
会从行中删除所有数字,并且只有当变量中没有其他字符时,条件才会变为真。

请尝试以下操作,并让我知道这是否有帮助

echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]*)$/)  print $0}'
编辑:上述代码也可以简化为以下代码

echo "123456789012345,3" | awk -F, '($1 ~ /^[[:digit:]]*$/)'

这里您正在打印与图案匹配的每一行。这正是
grep
的目的。既然@Inian出色地告诉了您代码的错误,那么让我提出一个基于
grep
的备选答案,它与
awk
命令完全相同(尽管速度要快得多):


出于某种原因,专家们鼓励使用更加惯用的
awk
,如
echo“123456789012345,3”|awk-F,$1~/^[:digit:]*$/'
。这不是多余的吗?@sjsam:当然是的!有时,当使用OP自己的命令并在上面进行修改时,会丢失一些微小的细节。不过接得不错!请随意编辑它,作为您的有效点!我可能不会,因为你已经谈到了op的正则表达式匹配的问题。顺便说一句,如果op有一个类似于
echo“,3”|awk-F,$1~/^[:digit:]*$/'
的输入,那么它会更有趣,因为op使用的是Gnu awk的3.1.5版,您可能应该添加
--posix
切换到量词(
{n,m}
)示例。@All:谢谢大家。我找到了我丢失的东西
echo“123456789012345,3”| awk-F,{if($1~/^([[:digit:]*)$/)print$0}'
from@Ravinder或
echo“123456789012345,3”| awk-F,{if($1~/^([[:digit:]+])$/)print$0}'
from@Inian就是这样做的。@xhine:我需要处理的实际文件将非常大。这就是使用awk的原因。我刚刚从我原本完整的脚本中取出了一行代码,以避免不必要的混乱,并且非常清楚我遗漏了什么,以及我期望的是什么。@dig_123如果您的文件很大,这正是为什么要选择
grep
而不是
awk
,后者可能慢100倍以上。除非您需要
awk
中的高级功能?也许你可以把你的
awk
放在
grep
的输出中,我想你会看到一些真正的加速。
echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]*)$/)  print $0}'
echo "123456789012345,3" | awk -F, '($1 ~ /^[[:digit:]]*$/)'
grep -E '^[[:digit:]]+,'