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
.