我发现了一个类似的主题,但不知道如何实现它供我自己使用:
问题是这样的:
我正在尝试在自己的项目中实现它,但似乎无法使其发挥作用。我正在使用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/
。p
p
:只要为 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>