【问题标题】:awk with egrep filter unable to return null value with condition带有 egrep 过滤器的 awk 无法在条件下返回空值
【发布时间】:2017-01-10 03:55:34
【问题描述】:

我是 awk 的新手,我的命令如下。当没有行返回时需要打印通过,否则打印失败。但是没有值的时候,pass是无法显示的

egrep -v "^\+" /etc/passwd | awk -F: '($1!="root" && $1!="sync" && $1!="shutdown" && $1!="halt" && $3<500 && $7!="/sbin/nologin") {print}' | awk '{if(NR==0||NR<=0||'null') print "pass"; else print "fail"}'

结果应该返回通过但有注意打印,请对此提出建议。

【问题讨论】:

  • edit 您的问题包括简洁、可测试、示例输入和预期输出,因此我们不会猜测您的输入文件包含什么或您想要输出什么。

标签: awk grep


【解决方案1】:

例如合二为一

$ awk -F: '!/^+/ && $1!="root" && ... {f=1; exit} 
       END {print (f?"fail":"pass")}' /etc/passwd

如果设置退出代码可能会更好

$ awk -F: '!/^+/ && $1!="root" && ... {exit 1}' /etc/passwd

【讨论】:

  • 恕我直言,如果发生失败,您应该添加一个不打印“pass”的标志,因为:(来自 awk doc)不属于 BEGIN 或 END 规则的退出语句会停止执行当前记录的任何进一步的自动规则,跳过读取任何剩余的输入记录,如果有则执行 END 规则
  • 似乎有很多负面因素 - 我希望有一种方法可以指定 OP 希望以正面而不是多重负面方式满足的任何条件。
【解决方案2】:

这可能是你想要做的:

awk -F: '/^+/ || $1~/^(root|sync|shutdown|halt)$/ || $3>=500 || $7=="/sbin/nologin"{next} {f=1; exit} END{print (f ? "pass" : "fail")}'

【讨论】:

  • 一如既往,直接高效
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 2019-04-08
  • 2021-05-15
  • 1970-01-01
  • 2021-04-26
  • 2022-10-09
  • 2013-08-11
  • 1970-01-01
相关资源
最近更新 更多