第 n 个特殊字符和字符串之间的正则表达式 select

Regex select between nth special character and a string

我有一个 ESXi 主机出现故障,我正在尝试 grep 故障时主机上 运行 的来宾。

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

日志的一部分内容如下:

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”,其中这将是所有虚拟机的名称,因为当然有多个条目都具有不同的名称。以下是我到目前为止的内容,除了我想 select 第 5 /

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

但是,上面的模式returns没有结果,可能是ESXi的限制,下面是我用来查找我需要的日志的。

grep -E "vim.fault" hostd.log

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

POSIX ERE 不支持环视。

你可以使用

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

此处,o 选项使 grep 提取匹配,E 启用 POSIX ERE 语法,[^][/]+\.vmx 正则表达式匹配一个或多个其他字符比 ][/ 然后 .vmx 子串。

或者,sed 喜欢

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

这里,

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