grep 由“-”分隔的字符串中的第三个关键字

问题描述

在linux中显示hostname命令后,我的主机名详细信息如下

my-host-test-db-10001.dns.biz.xyz.com
my-host-test2-db-10002.dns.biz.xyz.com
my-host-test3-db-10003.dns.biz.xyz.com

我想从上面的 (test/test2/test3) 中获取第三个字符串。我怎样才能实现它?

解决方法

除了使用 with `project.dataset.table` as ( select '{"fruit":[{"apples":"5","oranges":"10"},{"apples":"5","oranges":"4"}]}' json union all select '{"fruit":{"apples":"1","oranges":"15"}}' union all select '{"fruit":{"apples":"5","oranges":"1"}}' union all select '{"fruit":[{"lettuce":"7","kale": "8"}]}' ) 的更简单的解决方案外,您还可以使用更灵活的 cut

grep

例如:

hostname | grep -Po '^[^-]+-[^-]+-\K[^-]+'

输出:

grep -Po '^[^-]+-[^-]+-\K[^-]+' <<< 'my-host-test2-db-10002.dns.biz.xyz.com'

此处,GNU grep 使用以下选项:
test2 :使用 Perl 正则表达式。
-P :仅打印匹配项(每行 1 个匹配项),而不是整行。

-o :使正则表达式引擎“保留”它在 \K 之前匹配的所有内容,而不将其包含在匹配中。具体来说,在打印匹配时忽略正则表达式的前面部分。

另见:
perlre - Perl regular expressions