Awk
如何使用 sedawk 在文件中查找某些行,然後匹配所有匹配不同模式的後續行?
我發現了一個類似的主題,但無法弄清楚如何實現它以供我自己使用:
這是問題:
我正在嘗試在我自己的項目中實現它,但似乎無法使其工作。我正在使用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,直到下次發生這種情況,等等。
希望這是有道理的。謝謝!
試試這個,
awk '!/^-->/{p=0} /vm-1178/{p=1} p'
!/^-->/{p=0}``p
:當行不以 . 開頭時,將 var (如 print)設置為 0-->
。/vm-1178/{p=1}
: 每當行匹配時設置 varp
= 1/vm-1178/
。p
:只要為真就列印該行p
(此處=1)
您可以
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 匹配。這樣您還可以查找包含在正則表達式中具有特殊含義的字元的模式。