53
  1. I am using AWK script to process some logs.
  2. At one place I need to check if the variable value is null or empty to make some decision.

Any Idea how to achieve the same?

awk '

{
    {
       split($i, keyVal, "@")
       key=keyVal[1];
       val=keyVal[2];
       if(val ~ /^ *$/)
       val="Y";

    }

}

' File

I have tried with

1) if(val == "")

2) if(val ~ /^ *$/)

not working in both cases.

4

3 回答 3

63

与的比较""应该有效,所以这有点奇怪

作为另一种选择,您可以使用该length()函数,如果为零,则您的变量为空/空。例如,

if (length(val) == 0)

另外,也许内置变量NF(字段数)可以派上用场?由于我们无权访问您的输入数据,因此很难说,但还有另一种可能性。

于 2012-08-14T13:06:24.403 回答
16

您可以直接使用变量而不进行比较,考虑空/空/零值false,其他一切都是true

看这里 :

# setting default tag if not provided
if (! tag) {
        tag="default-tag"
}

因此,此脚本将具有tag带有值的变量,default-tag除非用户这样调用它:

$ awk -v tag=custom-tag -f script.awk targetFile

这是真实的:GNU Awk 4.1.3,API:1.1(GNU MPFR 3.1.4,GNU MP 6.1.0)

于 2017-08-24T14:41:51.327 回答
13

它对我来说很好用

$ awk 'BEGIN{if(val==""){print "null or empty"}}'
null or empty

您无法区分变量为空和空,当您访问“未设置”变量时,awk 只是用默认值初始化它(这里是""- 空字符串)。您可以使用某种解决方法,例如,在访问变量时将val_accessed变量设置为0然后设置为1。或更简单的方法(有点“hackish”)将 val 设置为"unitialized"(或运行程序时无法出现的其他值)。

PS:你的脚本对我来说看起来很奇怪,嵌套括号是做什么用的?

于 2012-08-14T13:15:14.883 回答