awk脚本,需要以下关键字
使用这个返回多行结果:awk脚本,需要以下关键字
awk '$1 == "pool" { f=1; print $1,$2; next }
f == 1 { if ($1 == "pool") { print }
else if ($1 == "members") { print }
else if ($0 ~ /^}/) { f=0 }
}' bigip.conf
也就是说,直到配置有以下行的IP地址工作正常。 我如何获得它打印IPs,如果他们在以下线路上。 配置有两个,有一些在同一行上,一些在下一个1,2或3行。
数据:
pool pl_stage_xxx_microsites_9483 {
monitor all tcp_half_open
members {
11.11.11.11:9483 {}
11.22.22.22:9483 {
session user disabled
}
}
}
很难没有看到更多您的数据和预期产出的说,但我认为,所有你需要的是这样的:
awk '
/^}/ { inPool=0 }
$1 == "pool" { inPool=1; inMembers=0 }
inPool {
if ($1 == "pool") {
print $1, $2
print
}
else if ($1 == "members") {
inMembers = 1
}
if (inMembers) {
print
}
}
' file
上面至少应该是一个很好的起点。关于使用getline发布的其他答案 - getline有一些适当的用途,但这不是其中之一,直到您完全理解并可以接受所有注意事项才使用getline,请参阅http://awk.info/?tip/getline。
我把第一个问题问题 – c00kiemon5ter
这是一个比较日期,运行上面的作品禁止它打印的“池子”行两次:池pl_website_443 { 监控所有tcp_half_open_http 成员11.22.33.44:https {}} 池 {pl_website_80显示器 所有tcp_half_open 成员{ 11.22.33.44:http {} 11.22.33.44:http {} } } pool pl_stage _website_apacretail_9090 { 监控所有tcp_half_open 成员{ 11.22.33.44:websm {} 11.22.33.44:websm {}} } – antipentium
想不通为什么它会打印池线的两倍。它确实从游泳池行打印$ 1和$ 2,然后打印整个游泳池行,就像您最初发布的代码一样。如果你不需要这些,只需删除其中一条打印线。 –
请尝试以下awk
代码:
awk '
$1 == "pool" {
f=1
print $1,$2
next
}
f == 1 {
if ($1 == "pool") {
print
}
else if ($1 == "members") {
print
getline
while ($0 ~ "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,5}"){
print
getline
}
}
else if ($0 ~ /^}/) {
f=0
}
}'
,而他们的存在,将打印IP线路。
heh,我的awk脚本:D – c00kiemon5ter
[this](http://*.com/questions/12902353/bash-if-then-script-to-parse-file)是第一个问题 – c00kiemon5ter