grep -v(反向匹配)匹配单词和行后面的匹配。 -A -B 不工作

问题描述 投票:0回答:1

我想格式化命令循环的输出,该循环检查跨 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"
但是 不起作用:(

bash awk sed grep
1个回答
0
投票

使用 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}'
© www.soinside.com 2019 - 2024. All rights reserved.