我發現了一個類似的主題,但不知道如何實現它供我自己使用:
問題是這樣的:
我正在嘗試在自己的專案中實現它,但似乎無法使其發揮作用。我正在使用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>