使用awk验证属性文件

时间:2015-11-20 16:03:32

标签: regex awk

我使用awk验证属性文件并仅输出正确的行。我在属性文件中使用了多个分隔符。

以下是样本:

host1:/var/tmp/dir1/,host2:/var/tmp/dir2/
host2:/var/tmp/dir2/abc.tgz,host3:/var/tmp/

#example of wrong format
host1::/var/tmp/dir1,host2:/var/tmp/
host1:/var/tmp/dir1,:host2:/var/tmp/

我的分隔符在上面的属性文件的第一行中显示:,:只有相同的格式,并且只能出现一次。

这是我尝试执行的awk代码,但它总是会为我返回错误。

#!/usr/xpg4/bin/awk -f

BEGIN{
    FS=":,:"
}
{
    if ($0 ~/\[(.*)?([^%]*%[^%])(.*)?([^%]*%[^%])(.*)?([^%]*%[^%])]/) {  
        print "validated line " $0
        next
    } else {
        print "error in line " $0

    };

}

我在这里遗漏了什么吗?或者我的正则表达式是否过于简单而无法捕获该行?

,输出始终为

行host1中的

错误:/ var / tmp / dir1 /,host2:/ var / tmp / dir2 / 行host2中的错误:/var/tmp/dir2/abc.tgz,host3:/ var / tmp /

3 个答案:

答案 0 :(得分:1)

你的方法存在缺陷。您需要编写正则表达式来描述整行的格式。为了帮助您实现这一目标,您需要描述正确的格式。猜测会是这样的:

/^[[:alnum:]]+:[[:alnum:]\/\.]+,[[:alnum:]]+:[[:alnum:]\/\.]+$/

其中[[:alnum:]]+表示一个或多个字母数字字符,而[[:alnum:]\/\.]+也表示/.

然后脚本将是:

/^[[:alnum:]]+:[[:alnum:]\/\.]+,[[:alnum:]]+:[[:alnum:]\/\.]+$/ {
    print "valid: " $0
    next
}
{
    print "invalid: " $0
}

您可以强制要求分隔符仅使用以下模式以指定的顺序出现,而不是使用[[:alnum:]]

/^[^:,]+:[^:,]+,[^:,]+:[^:,]+$/

答案 1 :(得分:1)

为了抓住:::,(通过扩展,它还会检查,:,,)您可以将您的FS定义为[:,]并检查空田。简单的验证可以(使用您的输入文件)

$ awk -F"[:,]" '{for(i=1;i<=NF;i++) 
                    if($i=="") 
                       print "error on field " i " --> " $0}
               ' file
error on field 2 --> host1::/var/tmp/dir1,host2:/var/tmp/
error on field 3 --> host1:/var/tmp/dir1,:host2:/var/tmp/

答案 2 :(得分:1)

我认为你正在寻找更像这样的东西:

BEGIN {FS=":"}
NF==3 && split($2,a,",")==2 {print "validated line " $0;next}
{print "error in line " $0}