给出以下输出,如何提取retention.ms
的值3333
?
最终我想topic has retention of 3333 milliseconds
从命令的输出中打印出来kafka-topics.sh ...
:
$kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic topic
Topic: topic cleanup.policy=delete,segment.bytes=999,retention.ms=3333,flush.messages=444
为了简洁起见,我缩短了文本。
我不会用
awk
。如果您有 GNUgrep
或 Perl,您可以使用后视模式:输出
或者
sed
或者
perl
他们都在做同样的事情:寻找
retention.ms=
并捕获后面的数字。任何时候你有 tag=value 输入,我发现最好首先创建一个将标签(名称)映射到关联值的数组,即
f[]
下面,然后你可以测试、比较、打印、选择或执行任何你想要的操作您的输入只需使用您关心的任何标签对数组进行索引,无论输入字段的顺序如何以及是否可能丢失。例如,仅出于演示目的而使用
cat file
而不是kafka-topics
命令并使用任何 POSIX awk:如果您的真实数据引用了包含空格或任何内容的字段,那么只需更改填充的循环
f[]
即可,网上有很多此类代码的示例。这是上面的调整版本,因此您可以
f[]
通过读取输入行来查看包含的所有 tag=value 对:所以你可以编写如下代码:
这表明您可以比较您喜欢的任何内容,并以您喜欢的任何顺序打印您喜欢的任何内容,只需使用标签作为 的索引
f[]
,您所要做的就是编写代码来填充f[]
,这通常很简单,就像我上面的第一个脚本一样。使用Raku(以前称为 Perl_6)
或者:
Raku 是 Perl 家族的一种编程语言。与 Perl 本身一样,Raku 也内置了哈希/映射(即成对的键/值存储)。
split
将该行插入2
元素,其拼写可以读作“find Y after X”。<?after X > Y
andthen
显式地重新加载主题变量,以便我们可以在后面的“子句”中使用.[0]
和索引。.[1]
.[1]
分割后的第二个元素进一步位于由等于/逗号组成的自定义字符类split
上。<+[=,]>
这些元素被%(…)
强制转换为哈希值,并且与“retention.ms”键专门关联的值是通过熟悉的%hash{$key}
习惯用法获得的。BEGIN
块来抽象出所需的$topic
和$key
。同样,与“retention.ms”键专门关联的值是通过熟悉的%hash{$key}
习惯用法获得的。输入示例:
示例输出:
最后,正如@EdMorton 的出色回答一样
awk
,您可以简单地循环哈希以获取键/值对的列表返回:https://docs.raku.org/language/regexes#Lookbehind_assertions
https://docs.raku.org/language/hashmap
https://raku.org