awk和if条件不能正常工作

awk和if条件不能正常工作,awk,Awk,输入用以下符号分隔的示例列: 预期的输出是以制表符分隔的字段,其中最后一列是转换为人类可读日期的AD date格式的时间。当然,我需要忽略最后一列中的任何非可转换字符串 我所尝试的不起作用,看起来好像条件对我不起作用-所有都是使用else和设置n/a $ awk -F: '$2!=""{gsub(/CN=.+OU=Users,/," ");gsub(/,OU=.+$/," ");if($6~/^[0-9]+$/ || $6>0)

输入用以下符号分隔的示例列:

预期的输出是以制表符分隔的字段,其中最后一列是转换为人类可读日期的AD date格式的时间。当然,我需要忽略最后一列中的任何非可转换字符串

我所尝试的不起作用,看起来好像条件对我不起作用-所有都是使用else和设置n/a

$ awk -F: '$2!=""{gsub(/CN=.+OU=Users,/," ");gsub(/,OU=.+$/," ");if($6~/^[0-9]+$/ || $6>0) {d=strftime("%a %b %d %H:%M:%S %Z %Y",($6/10000000)-11644473600)} else {d="n/a"}}{print $1,$2,$3,$4,$5,d}' OFS=$'\t' input
US233541        us33541 User Name1      user1@host.com   OU=AAA         n/a
US233555        us33555 User Name2      user2@host.com   OU=BBB         n/a
US233590        us33590 User Name3      user3@host.com   OU=AAA         n/a
US233599        us33599 User Name4      user4@host.com   OU=BBB         n/a
US233500        us33500 User Name5      user5@host.com   OU=CCC         n/a

由于您对最后一个字段有困难,这里有一个工作版本

$ awk -F: '{print ($NF~/^[0-9]+$/ && $NF>0)?strftime("%a %b %d %H:%M:%S %Z %Y",$NF/10000000-11644473600):"n/a"}' file

Mon Feb 08 08:40:19 EST 2021
n/a
Mon Feb 08 04:09:49 EST 2021
n/a
n/a

在获得太多选票之前,真正的原因是评论和其他答案中提到的贪婪的gsub。因为,我只看了最后一个领域,我错过了主要问题。另一个问题是| | vs&&use,但它是次要的。还请注意,$NF>0可以替换为$NF,因为第一个条件确保它是整数。

导致问题的是gsub函数,以及包含| |而不是&&的if语句。使用:和作为字段分隔符和取消使用gsub的需要,重新设计您的解决方案:

awk -F [\:\,] '$2!=""{if($NF~/^[0-9]+$/ && $NF>0) {d=strftime("%a %b %d %H:%M:%S %Z %Y",($NF/10000000)-11644473600)} else {d="n/a"}} {print $1,$2,$3,$4,$7,d}' OFS=$'\t' file

thx的所有提示,这里什么是工作现在

awk -F$'\t' '$2!=""{{gsub(/CN=.+OU=Users,/,"",$5);gsub(/,OU=.+$/,"",$5);if($6~/^[0-9]+$/&&$6>0) {d=strftime("%a %b %d %H:%M:%S %Z %Y",($6/10000000)-11644473600)} else {d="n/a"}}{print $1,$2,$3,$4,$5,d}}' OFS=$'\t'

这里的问题来自gsub/,OU=.+$/。例如,.+$匹配到,OU=Customer,DC=Domain,DC=com:132572652198323884并将其删除。也就是说,在你想做点什么之前,第六个字段已经消失了!作为一个实验,试着运行awk-F:“$2={gsub/CN=.+OU=Users,/,;gsub/,OU=.+$/,;print$0}'OFS=$'\t'inputAlso,$6~/^[0-9]+$/| |$6>0似乎是错误的,您可能需要&&取而代之?我担心如果有人有实名属性值,它可能会停止工作…如果您使用GNU awk,您可以使用gensub基于正则表达式拆分第5个字段
awk -F$'\t' '$2!=""{{gsub(/CN=.+OU=Users,/,"",$5);gsub(/,OU=.+$/,"",$5);if($6~/^[0-9]+$/&&$6>0) {d=strftime("%a %b %d %H:%M:%S %Z %Y",($6/10000000)-11644473600)} else {d="n/a"}}{print $1,$2,$3,$4,$5,d}}' OFS=$'\t'