我想格式化命令循环的输出,该循环检查跨 12 个 DNS 服务器的两个域的 DNS 设置的正确性
for i in {1..12} ; do nslookup hostname1.fqdn ns$i.provider.fqdn; nslookup hostname2.fqdn ns$i.provider,fqdn ; done"
标准输出如下所示:
Server: ns1.provider.fqdn
Address: 10.11.12.13
Name: hostname1.fqdn
Address: 172.21.37.1
Server: ns1.provider.fqdn
Address: 10.11.12.13
Name: hostname2.fqdn
Address: 172.21.37.1
Server: ns2.provider.fqdn
Address: 10.11.12.13
Name: hostname1.fqdn
Address: 172.21.37.1
Server: ns2.provider.fqdn
Address: 10.11.12.13
Name: hostname2.fqdn
Address: 172.21.37.1
我想把它切成以下形式:
DNS: ns1.provider.fqdn HOST: hostname1.fqdn IP: 172.21.37.1
DNS: ns1.provider.fqdn HOST: hostname2.fqdn IP: 172.21.37.1
DNS: ns2.provider.fqdn HOST: hostname1.fqdn IP: 172.21.37.1
DNS: ns2.provider.fqdn HOST: hostname2.fqdn IP: 172.21.37.1
但是在创建这种形式的输出的过程中,我一直坚持使用 grep 反向匹配 (-v) 不适用于 -A 和 -B 命令,这将允许我 grep 出每个 nslookup 输出的前 3 行并添加
echo DNS: ns$i.provider.fqdn"
,之后还有一些 sed
来格式化最终输出。或者我应该采取另一种方式,将 nslookup 输出放入变量(或数组)中并简单地回显其内容?或者以某种方式使用 sed/awk 来完成?
主要问题是如何“模拟”
grep sth -A 3
的行为,但使用 -v
- grep -v -A 3 sth
- 我已经尝试过使用 grep -vE "Server: ns[0-9]{1,2}.provider\nAddress"
但是
不起作用:(
使用 GNU
awk
:
for i in {1..12} ; do
nslookup hostname1.fqdn ns$i.provider.fqdn
nslookup hostname2.fqdn ns$i.provider,fqdn
done | awk -v RS='' 'NR%2==1 {server=$2} NR%2==0
{print "DNS: " server " HOST: " $2 " IP: " $4}'