我正在构建一个脚本,该脚本从 Supperputty XML 会话配置文件生成 ssh 配置文件。我不知道哪个工具可以更好地处理它。我尝试使用 awk 来实现它,但我没有收到预期的结果,因为字段永远不会相同。
输入文件:
<SessionData SessionId="DMZ contoso.prod.net" SessionName="amq01.contoso.prod.net" ImageKey="computer" Host="amq01.contoso.prod.net" Port="22" Proto="SSH" PuttySession="[webserver]-[EL]# PROD | xx" Username="user" ExtraArgs="" SPSLFileName="" />
<SessionData SessionId="Build und Deploy/[Websphere]-[IR]# Deploy" SessionName="[Websphere]-[Internal]# Deploy" ImageKey="computer" Host="deploy.contoso.prod.net" Port="22" Proto="SSH" PuttySession="[Websphere]-[internal]# Deploy" Username="usa" ExtraArgs="" SPSLFileName="" />
<SessionData SessionId="ImportedFromPuTTY/[DP]-[DMZ]# PROD | 01" SessionName="[DP]-[DMZ]# PROD | 01" Host="192.168.1.91" Port="2354" Proto="SSH" PuttySession="[DP]-[DMZ]# PROD | 01" Username="schnipi" SPSLFileName="" />
预期输出:
#short info
Host Hostfromfile
HostName amq01.contoso.prod.net
User user
Port 22
我已经尝试过一些方法,但只有第三种方法有效,因为 SessionId 始终保持在相同的位置:
awk 'if ( $2 ~ /SessionId="/,/\/"/ ) {print "#Test "$2}
awk -F '="' '{print($2 == /SessionId/) "#Test " $2 ""}' session >> Test.conf
awk -F '="' '{print "#Description: " $2 "\n" }' session >> Test.conf
awk -F '="' '/SessionId=/ {for (a=1;a<=NF;++a) if ($a~/SessionId=/) print "# " $a "\n"} ' session >> config
我不知道如何只输出引号之间的匹配而不输出引号。
答案1
尝试这个,
IFS=$'\n'
for i in `cat file.xml`
do
echo "$i" | awk -F '"' '{print "#Discription: " $2 "\nHost internal\n HostName " $8"\n User " $16 "\n Port "$10 }'
done
我得到的输出为:
#Discription: DMZ contoso.prod.net
Host internal
HostName amq01.contoso.prod.net
User user
Port 22
#Discription: Build und Deploy/[Websphere]-[IR]# Deploy
Host internal
HostName deploy.contoso.prod.net
User web
Port 22