gpt4 book ai didi

bash - 选择除文本 block 之外的所有内容

转载 作者:行者123 更新时间:2023-12-04 18:37:50 25 4
gpt4 key购买 nike

我有一个用于分布式网络监控系统的综合主机文件,我需要将其拆分为两个文件。一些主机放在一个文件中,其余的放在另一个文件中。我正在使用 sed拉出我需要的主机,但我不知道如何将其他所有内容放在另一个文件中,有点像 -v grep 的选项.

主机文件示例:

object Host "router" {
import "template"
display_name = "router"
address = "xx.xx.xx.xx "
}

object Host "switch" {
import "template"
display_name = "switch"
address = "xx.xx.xx.xx "
}

object Host "router" {
import "template"
display_name = "router"
address = "xx.xx.xx.xx "
}

object Host "otherthing" {
import "template"
display_name = "otherthing"
address = "xx.xx.xx.xx "
}

object Host "switch" {
import "template"
display_name = "switch"
address = "xx.xx.xx.xx "
}

object Host "otherthing" {
import "template"
display_name = "otherthing"
address = "xx.xx.xx.xx "
}
sed我用来拉出路由器的命令
sed '/router.*\n/p;//g;/{$/,/^}/H;//x;D' files/tmp/unsorted-host.tmp >> files/router.conf

另外我不知道排序是否比构建大型主机文件更有效,但这是我制作大型主机文件的方法:
    while read line
do
# The SNMP to check the device type outputs on multiple lines, check to ensure we only grab IP's
getip=$(echo $line | awk '{print $1}')
if ping -c 1 $getip &> /dev/null
then
ip=$getip
else
trash=$getip
fi
template="template"
host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community1 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}' )
if [ -z "$host_name" ]
then
host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community2 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}' )
if [ -z "$host_name" ]
then
host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community3 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}' )
if [ -z "$host_name" ]
then
host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community4 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}' )
if [ -z "$host_name" ]
then
host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community5 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}' )
if [ -z "$host_name" ]
then
host_name=$(echo " Not found ")

fi
fi
fi
fi
fi
echo "
object Host $host_name {
import \"$template\"
display_name = $host_name
address = \"$ip \"
}"
done < files/tmp/hosts.tmp > files/tmp/unsorted-hosts.tmp

目标是拥有两个文件,一个包含路由器,一个包含其他所有文件。提前感谢您的任何建议!

最佳答案

使用 awk:

awk -v RS= '/router/' hosts.txt > routers.txt
awk -v RS= '!/router/' hosts.txt > non_routers.txt

或使用一个 awk:
awk -v RS= '/router/ {print > "routers.txt"}; !/router/ {print > "non_routers.txt"}' hosts.txt

见: 8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

关于bash - 选择除文本 block 之外的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40597302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com