Awk

如何使用 sedawk 在文件中查找某些行,然後匹配所有匹配不同模式的後續行?

  • April 15, 2020

我發現了一個類似的主題,但無法弄清楚如何實現它以供我自己使用:

在匹配的目標行之後抓取多行

這是問題:

我正在嘗試在我自己的項目中實現它,但似乎無法使其工作。我正在使用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}: 每當行匹配時設置 var p= 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 匹配。這樣您還可以查找包含在正則表達式中具有特殊含義的字元的模式。

引用自:https://unix.stackexchange.com/questions/579976