【问题标题】:Grep exact match for Kubernetes namespace (non-files)Kubernetes 命名空间(非文件)的 Grep 完全匹配
【发布时间】:2022-02-23 01:17:19
【问题描述】:

背景:我的 k8s 集群中有两个部署(例如)如下:

foo-bar
foo-bar-asd

在我的管道中,我想实现逻辑来检查是否已经部署了任何名为“foo-bar”的部署。

如何构造我的命令以仅获取/输出“foo-bar”,而不是“foo-bar-asd”?

我尝试过使用正则表达式、'^foo-bar$' 等但没有成功,通过谷歌搜索/类似的 stackoverflow-questions 找到。

我当前的命令(同时获取):

kubectl -n my-namespace get deployments | grep foo-bar 

提前感谢您的帮助!

编辑: 意识到乞丐不能成为选择者,但是除了获取“foo-bar”之外,我还需要该命令不明确提及“foo-bar-asd”。 (构建一个放置此命令的管道,并且应该对不同的应用程序是通用的。没有完全解释,但希望有一点。)

【问题讨论】:

  • 使用grep ^foo-bar$`

标签: bash kubernetes azure-aks


【解决方案1】:

grep 命令也可以排除某些字符串。你可以运行类似的东西

kubectl -n my-namespace get deployments | grep foo-bar | grep -v foo-bar-asd

这应该会告诉你你在寻找什么。

【讨论】:

  • 这成功了!您能找到一种无需明确编写 "foo-bar-asd" 的方法吗? (最后写了 300 个字符来解释我的情况和原因,但它变得一团糟。我基本上是在构建一个通用管道,它根据应用程序加载一个值,例如“foo-bar”,这就是为什么“foo-bar- asd”作为管道中的命令对我来说很难)
  • 如果第一次部署将永远保持foo-bar,我们不必从头到尾写所有字符串。这也应该有效:kubectl -n my-namespace get deployments | grep foo-bar | grep -v foo-bar- 我假设所有生成的部署在 foo-bar 之后都会有一个破折号 (-)。所以基本上我们可以将 foo-bar 与 foo-bar 分开,并在其末尾添加破折号。
  • 它会 - 所以这很棒,我刚刚验证它可以在我的管道中运行它。 :) 谢谢!你能编辑你帖子中的结果让我给你绿色检查吗?
  • 很高兴听到这个消息:)
【解决方案2】:

由于您的搜索模式包含连字符,因此您不能使用“仅整个单词”,因为连字符被视为单词分隔符,所以我的第一个答案是错误的。
你需要说你的话代表整行,你可以这样做:

grep "^foo-bar$"

^ 代表“行首”。
$ 代表“行尾”。

编辑:第一个答案,这是错误的。

我的grep (GNU grep 3.4 ... 2019-12-29) 版本有一个-w 开关,我可以用它来过滤“仅整个单词”,所以在你的情况下它是:

grep -w "foo-bar"

【讨论】:

  • 可以确认,您的建议导致输出包含两个部署。谢谢你!
  • @ErikJönelid:我已经修改了我的答案,你能检查一下吗?
  • 对不起,当我尝试使用 ^$ 开始/结束时,不返回任何东西(奇怪)。我也在 3.4 版...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
相关资源
最近更新 更多