如何使用 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_pat1。
  • 第二條規則指出,所有以 開頭的後續行-->也將被列印。
  • 第三條規則用於在第一行重置該標誌不是包含該模式或不以 a 開頭-->,以便在再次找到該模式之前不會列印任何內容。

請注意,在第一條規則中,index使用的是函數而不是 RegExp 匹配。這樣您也可以尋找包含在正規表示式中具有特殊意義的字元的模式。

答案3

使用 perl,這可以工作:

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

相關內容