如果 awk 命令中的条件在 BEGIN 块中没有按预期工作。如果我错了请纠正我

if condition in awk command is not working as expected in BEGIN block. correct me if am wrong

我有如下命令

kubectl get pods |
grep -v 1/1 |
grep -v 2/2 |
awk '{print ::}' |
awk 'BEGIN{ print "<style>table,th,td {border:1px solid black;}

来自 kubectl 的示例输出:

NAMESPACE   NAME      READY       STATUS              RESTARTS
ABC       ABC-jkij     1/1        RUNNING          897
BAC       BAC-jkij     2/2        RUNNING          897
HJI       HJI-jkij     2/2        RUNNING          897

kubectl get pods | grep -v 1/1 | grep -v 2/2 | awk '{print ::}'

上面的命令只会产生如下所示的 headers,因为我保留了 -v:

NAMESPACE   NAME      READY       STATUS              RESTARTS

所以在 Awk 中我们没有正确的记录变量,我想在 Awk 块中放置一个条件,它应该只在有任何 0/1 或 0/2 pod 结果时打印,而不仅仅是 headers.

总结一下

NAMESPACE   NAME      READY       STATUS              RESTARTS

--> awk 不应打印任何内容

NAMESPACE   NAME      READY       STATUS              RESTARTS
ABC       ABC-jkij     0/1        RUNNING               897
ABC       ABC-jkij     0/2        RUNNING               897

Awk 应仅在上述情况下打印。

如果没有 pods with 0/1 0/2 etc., status,上面的命令将给出 headers like NAME NAMESPACE STATUS 作为输出。现在我想包括一个 if 条件说 if (NR >1 ) 那么只有它应该打印否则它不应该打印任何东西,即 headers。如果我试图将 if (NR>1) 放在开始块中,它仍在打印 headers.

通常应避免将 Awk 管道连接到 Awk;它是一种脚本语言,因此您可以添加任意多的语句。

kubectl get pods | 
awk 'NR>1 && !/1\/1|2\/2/ {
    if (!headers++) print "<style>table,th,td {border:1px solid black;}</style><table>"
    print "<tr>"
    for (i=1; i<=3; ++i) printf "<td>%s</td>\n", $i
    print "</tr>"
  }
  END { if (headers) print "</table>" }'

我不得不猜测一下您的预期输出是什么,但如果有问题,我希望应该很容易看出要修复什么。