【问题标题】:Regex select between nth special character and a string正则表达式在第 n 个特殊字符和字符串之间进行选择
【发布时间】:2021-11-03 19:41:06
【问题描述】:

我有一个失败的 ESXi 主机,我正在尝试 grep 可能在失败时在主机上运行的来宾。

在我们重新启动 ESXi 主机后,我发现了一些虚拟机无法加载的日志,这可能会提供我正在寻找的信息,但是,我只对虚拟机名称感兴趣并将其编译成一个列表。

日志的一部分内容如下:

2021-09-06T13:33:01.272Z info hostd[2101147] [Originator@6876 sub=Vmsvc.vm:/vmfs/volumes/5c0ae3ca-926257bb-d4dc-1234567e66bc/VMNAME/VMNAME.vmx] Failed to load virtual machine: N3Vim5Fault12FileNotFound9ExceptionE(Fault cause: vim.fault.FileNotFound

我的最终目标是获取“VMNAME”,这将是所有虚拟机的名称,因为当然有几个条目都具有不同的名称。以下是我目前所拥有的,除了我想选择第 5 个/

(?=\/).*(?=.vmx)

但是,上面的模式没有返回结果,可能是 ESXi 的限制,下面是我用来查找所需日志的方法。

grep -E "vim.fault" hostd.log

如果我必须将 grep 的结果粘贴到 np++ 中以获得正确的正则表达式,那也可以。 非常感谢您的任何帮助。

【问题讨论】:

  • POSIX ERE 不支持环视。试试grep -oE '[^][/]+\.vmx' hostd.log。或sed -nE 's,.*/([^][/]+\.vmx).*,\1,p' hostd.log
  • 这很棒,完全符合我的要求。仍然必须使用 np++ 删除重复的行,但我得到了我需要的东西,谢谢 Wiktor。

标签: regex grep esxi


【解决方案1】:

POSIX ERE 不支持环视。

你可以使用

grep -oE '[^][/]+\.vmx' hostd.log

这里,o 选项使 grep 提取匹配项,E 启用 POSIX ERE 语法,[^][/]+\.vmx 正则表达式匹配除 ][/ 之外的一个或多个字符,然后.vmx 子字符串。

或者,或者,sed 喜欢

sed -nE 's,.*/([^][/]+\.vmx).*,\1,p' hostd.log

这里,

  • -nE - n 选项抑制默认行输出,E 启用 POSIX ERE 语法
  • s,.*/([^][/]+\.vmx).*,\1,p - substitution 命令找到
    • .* - 任何文字
    • / - / 字符
    • ([^][/]+\.vmx) - 第 1 组:除 []/ 之外的一个或多个字符,然后是 .vmx
    • .* - 任何文字
  • \1 - 将匹配项(整个字符串)替换为 Group 1 值
  • p - 只打印替换的结果。

【讨论】:

    猜你喜欢
    • 2017-07-16
    • 2019-11-25
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2012-09-17
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多