如何使用 sed\awk 查找文件中的某些行,然后匹配与不同模式匹配的所有后续行?

如何使用 sed\awk 查找文件中的某些行,然后匹配与不同模式匹配的所有后续行?

我发现了一个类似的主题,但不知道如何实现它供我自己使用:

抓取匹配目标行后的多行

问题是这样的:

我正在尝试在自己的项目中实现它,但似乎无法使其发挥作用。我正在使用Linux,有人可以破解它吗?

基本上我想做的是遍历日志包并捕获特定的行及其堆栈\详细信息。这是一个例子:

2020-01-20T05:58:19.119Z verbose vpxa[6E21B70] [Originator@6876 sub=PropertyProvider opID=k5cokp1a-928316-auto-jwal-h5:70047736-92-01-84] [CommitChangesAndNotify] Updating cached values
2020-01-20T05:58:19.119Z info vpxa[6E21B70] [Originator@6876 sub=Default opID=k5cokp1a-928316-auto-jwal-h5:70047736-92-01-84] [VpxLRO] -- ERROR task-107599 -- **vm-1178** -- vim.VirtualMachine.reconfigure: vmodl.fault.InvalidArgument:
--> Result:
--> (vmodl.fault.InvalidArgument) {
-->    faultCause = (vmodl.MethodFault) null,
-->    faultMessage = (vmodl.LocalizableMessage) [
-->       (vmodl.LocalizableMessage) {
-->          key = "msg.disk.extendFailure",
-->          arg = (vmodl.KeyAnyValue) [
-->             (vmodl.KeyAnyValue) {

我想要捕获包含“vm-1178”的每一行以及以“-->”开头的所有后续行,直到模式发生变化,然后开始查找 vm-1178 直到下一次发生这种情况,等等。

希望这是有道理的。谢谢!

答案1

尝试这个,

awk '!/^-->/{p=0} /vm-1178/{p=1} p'
  • !/^-->/{p=0}p每当行不以 开头时,将 var (如 print)设置为 0 -->
  • /vm-1178/{p=1}p:每当行匹配时设置 var = 1 /vm-1178/
  • pp:只要为 true就打印该行(此处=1)

答案2

您可以awk为此目的使用:

awk 'index($0,"vm-1178")>0 {in_pat=1; print; next} \
in_pat == 1 && $0 ~ /^-->/ {print; next} \
{in_pat=0}' logfile.txt

它包含三个规则:

  • 第一条规则将查找包含该模式的行并打印它们,并将内部标志设置in_pat为 1。
  • 第二条规则指出,所有以 开头的后续行-->也将被打印。
  • 第三条规则用于在第一行重置该标志不是包含该模式或不以 a 开头-->,以便在再次找到该模式之前不会打印任何内容。

请注意,在第一条规则中,index使用的是函数而不是 RegExp 匹配。这样您还可以查找包含在正则表达式中具有特殊含义的字符的模式。

答案3

使用 perl,这可以工作:

 perl -ne ' { $t=0 if ( !/^-->/ ); $t=1 if(/vm-1178/); print if($t); }' <filename>

相关内容