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
.