AWK中的正则表达式

时间:2015-12-03 21:05:49

标签: regex bash awk

我正在尝试使用awk模式解析以下输入:

史密斯,吉姆12.34

12.34 Jim Smith

我有一个模式检查是否第一个字段包含一个字母字符,第二个字段包含一个字母字符,第三个字段包含一个数字,第二个模式检查第二个案例,如下所示:

$1 ~ /[A-Za-z]/ && $2 ~ /[A-Za-z]/ && $3 ~ /[0-9]/{
do fun things with record
}
$3 ~ /[A-Za-z]/ && $2 ~ /[A-Za-z]/ && $1 ~ /[0-9]/
{
this is the second form of the record
}

但是,我的程序似乎正在通过两个检查并执行这两个操作。我一直试图找出我搞砸的地方,但同样的事情一直在发生。任何正确方向的点都非常感谢。我知道有很多方法可以做到这一点。我发现其中的一些,但我想知道我在这里做错了什么。

我用awk运行CentOS 7:

gawk --version
GNU Awk 4.0.2

2 个答案:

答案 0 :(得分:4)

问题是在第二个模式之后的开口括号之前的换行符。这将按预期工作:

$1 ~ /[A-Za-z]/ && $2 ~ /[A-Za-z]/ && $3 ~ /[0-9]/{
 print "do fun things with record"
}
$3 ~ /[A-Za-z]/ && $2 ~ /[A-Za-z]/ && $1 ~ /[0-9]/{ # NO newline here
 print "this is the second form of the record"
}

解释:AWK程序由一对pattern { action }对组成,其中 模式或动作可以省略。在模式和动作之间添加换行符将使awk解析为没有动作的模式,然后是没有模式的动作(即无条件执行的动作)。

底线:在AWK中坚持Egyptian Brackets

答案 1 :(得分:1)

如果您的字段包含字母和数字值,它将通过两个测试。例如。

$ echo "James007" | awk '/[a-zA-Z]/{print "alpha"} /[0-9]/{print "number"}'

将同时打印。如果你想限制只有alpha和数字,你可以这样做

$ echo "James 007" | awk '$1~/^[a-zA-Z]+$/{print "alpha"} $2~/^[0-9]+$/{print "number"}'