我使用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 /
答案 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}