将 AWK 与变量模式一起使用时,无法使 IF ELSE 语句正常工作

将 AWK 与变量模式一起使用时,无法使 IF ELSE 语句正常工作

AWK 语句使用变量 $ip 来搜索每一行,但我需要在 ELSE 语句中打印变量 $ip NOT FOUND 来查找配置中未找到的 ip。

无法让它与 IF ELSE 一起使用,无法在 ELSE 语句中重用 $ip 变量,因此它会打印 999.999.999.999 NOT IN CONFIG!

另外,如果可能的话,不使用多余的 getline getline getline,比如也许是跳过 3 行的方法?

 declare -a iplist=(
 "192.168.0.10" 
 "192.168.0.20" 
 "192.168.0.30" 
 "999.999.999.999"
)

for ip in "${iplist[@]}"; do

awk "/$ip/" '{if {print $0; getline; getline; getline; print $0; print "-----"} else {print "/$ip/" "NOT FOUND"}' /home/user/D1/config

### BELOW WORKS - But, need the IF ELSE Statement ###
awk "/$ip/"'{print $0; getline; getline; getline; print $0; print "-----"}' /home/user/D1/config
done

配置文件内容:

ip=192.168.0.10
mask=255.255.255.0
allow=on
text=off
path=/home/user/D1/test/server1
-----
ip=192.168.0.20
mask=255.255.255.0
allow=on
text=off
path=/home/user/D1/test/server1
-----
ip=192.168.0.30
mask=255.255.255.0
allow=on
text=off
path=/home/user/D1/test/server1
-----

期望的输出:

ip=192.168.0.10
path=/home/user/D1/test/server1
-----
ip=192.168.0.20
path=/home/user/D1/test/server1
-----
ip=192.168.0.30
path=/home/user/D1/test/server1
-----
ip=192.168.0.30
path=/home/user/D1/different-path-than-line-above/server1
-----
ip=999.999.999.999 NOT IN CONFIG
-----

答案1

正确的方法是使用 IP 列表调用 awk 一次,创建值的标签/名称数组(f[]如下),然后仅通过名称访问值。没有 shell 循环(这会非常慢),也没有 getlines(参见http://awk.freeshell.org/AllAboutGetline为什么通常最好避免这些)要求:

$ cat tst.sh
#!/bin/env bash

declare -a iplist=(
    '192.168.0.10'
    '192.168.0.20'
    '192.168.0.30'
    '999.999.999.999'
)

awk -v iplist="${iplist[*]}" '
    BEGIN {
        split(iplist,tmp)
        for (idx in tmp) {
            ip = tmp[idx]
            cnt[ip] = 0
        }
        OFS = "="
        sep = "-----"
    }
    {
        tag = val = $0
        sub(/=.*/,"",tag)
        sub(/^[^=]+=/,"",val)
        f[tag] = val
    }
    $0 == sep {
        ip = f["ip"]
        if ( ip in cnt ) {
            cnt[ip]++
            print "ip", ip
            print "path", f["path"]
            print sep
        }
        delete f
    }
    END {
        for (ip in cnt) {
            if ( cnt[ip] == 0 ) {
                print "ip", ip " NOT IN CONFIG"
                print sep
            }
        }
    }
' config

$ ./tst.sh
ip=192.168.0.10
path=/home/user/D1/test/server1
-----
ip=192.168.0.20
path=/home/user/D1/test/server1
-----
ip=192.168.0.30
path=/home/user/D1/test/server1
-----
ip=999.999.999.999 NOT IN CONFIG
-----

我使用tag = val = $0等将标签与其值分开,而不是依赖于设置,FS="="因为=可以出现在 UNIX 目录或文件名中,因此也可以出现在path.

相关内容