가변 모드에서 AWK를 사용할 때 IF ELSE 문이 제대로 작동하지 않습니다.

가변 모드에서 AWK를 사용할 때 IF ELSE 문이 제대로 작동하지 않습니다.

AWK 문은 $ip 변수를 사용하여 각 줄을 검색하지만 구성에서 찾을 수 없는 ip를 찾으려면 ELSE 문에 $ip NOT FOUND 변수를 인쇄해야 합니다.

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[]아래)의 레이블/이름 배열을 만든 다음 이름으로만 값에 액세스하는 것입니다. 쉘 루프(매우 느림)도 없고 getline도 없습니다(참조).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설정에 의존하기보다는 etc를 사용하여 값에서 레이블을 분리합니다. FS="="왜냐하면 =레이블은 UNIX 디렉터리나 파일 이름에 나타날 수 있고 따라서 path.

관련 정보