下午好!
我希望对多个类执行查询,并仅返回那些缺少特定属性的类。
例如,在我正在使用的程序中,假设我有一个类Car
- 本例中的汽车有一个对象Tyres
- 该对象Tyres
可以有 1 个或多个属性:
Brand 1
Brand 2
Brand 3
我想做的是运行查询并返回以下类:
没有品牌1
我遇到的问题是,当我运行此查询并 grep 结果时,它似乎返回所有类并简单地忽略 Brand 1,而不是返回满足上述要求的类。
例如,如果类具有用于此参数的目的的Car_1
对象,则该对象具有 3 个属性, - 我只想显示没有品牌 3 的类 - 相反,Grep 似乎返回省略了品牌 3 的类。Tyres
Brand 1 Brand 2 Brand 3
实现我所追求的目标的最佳解决方案是什么?
对于明显的模糊性,我提前表示歉意,我试图对我正在使用的程序保持中立,只专注于以正确的方式 Grepping 结果。
干杯!
答案1
尝试这样的事情:
moquery ..... |
sed -e 's/^#/\n#/' |
perl -00 -ne 'print unless /^Tyres\h*:.*\bBrand 1\b/mig'
该sed
脚本在每个 之前插入一个换行符#
。这使得它适合在perl
(或awk
)中以“段落模式”进行处理。 “段落”是一行或多行文本,它们之间至少有一个空行。
简而言之,sed
将其转换(取自 rednectar.net 博客文章的示例数据moquery – Cisco 的 Mysterious Obscure ACI 查询实用程序):
# fv.Tenant
name : Tenant5
dn : uni/tn-Tenant5
uid : 15374
# fv.Tenant
name : common
dn : uni/tn-common
uid : 0
# fv.Tenant
name : Tenant3
dn : uni/tn-Tenant3
uid : 15374
对此:
# fv.Tenant
name : Tenant5
dn : uni/tn-Tenant5
uid : 15374
# fv.Tenant
name : common
dn : uni/tn-common
uid : 0
# fv.Tenant
name : Tenant3
dn : uni/tn-Tenant3
uid : 15374
然后,Perl 脚本将打印除包含“Brand 1”的 Tires 条目之外的所有记录。正则表达式不区分大小写,并\b
在“Brand 1”周围使用单词边界标记,以便它不会进行部分匹配(例如“Off-Brand 1”或“Brand 100”)。
如果您需要对记录进行更多处理(例如匹配其他字段,或提取一些数据并对其执行某些操作),您可以执行以下操作:
moquery ..... |
sed -e 's/^#/\n#/' |
perl -00 -ne '
next if /^Tyres\h*:.*\bBrand 1\b/mig;
...more perl statements here...;
print'
或者您可以编写一个独立的 Perl 脚本,而不是使用-n
.
也可以看看:ACI 对象 moquery 备忘单 来自思科的社区网站。