Awk

從最後一次出現的模式grep到另一個模式

  • November 22, 2017

早上好,

我正在嘗試為具有多個重複模式的文件編寫一個 UNIX 腳本,然後是我正在尋找的模式。這個問題非常類似於:

在另一個模式之前獲取模式的最後一次出現”。但是我沒有’tac’(或’tail -r’),並且希望返回String2 之前最後一次出現的String1,以及String2。

輸出:

...
Condition 1: A
foo
Condition 1: B
foo
Condition 2: C
foo
Condition 1: D
foo
Condition 1: E
foo
Condition 2: F
...

我想寫一個 grep / sed / awk 腳本來返回:

Condition 1: B
Condition 2: C
Condition 1: E
Condition 2: F

由於條件 1 始終是條件 2 上方的“x”行,因此我嘗試使用:

grep -B x "Condition 2"

然後從那裡開始,但由於某種原因,結果腳本輸出中的第二次出現從頂部停止了幾行(因此不顯示條件 1),因為條件 1 / 2 之間可能存在空白行,我不確定原因。所以我放棄了使用 grep -B。我認為 tac 會有所幫助,因為我可以 grep ‘backwards’,但我的環境中沒有 tac 命令(或 tail -r)。

想知道是否有人有任何建議,將不勝感激。提前感謝您的時間和幫助。

好吧,如果grep不能正常工作,不確定是否能正常工作awk,但你可以試試這個:

awk '/Condition 1/ { acc = $0; } /Condition 2/ { print acc; print; }' input

基於替代條件的更通用的使用(並不總是在循環 2-1 中)。它記住最後一個條件並比較它是否改變,如果改變則列印最後一個條件行,如果不記得它。同樣在退出時列印最後一次記憶,並在第一個條件發生時啟動記憶循環。

awk -F '[[:blank:]:]*'
  /^Condition/ { 

     if (Index == $2) Last = $0
      else if (Index ~ /^$/) Index = $2; Last = $0
            elseprint Last
     Index = $2
     }
  END { print Last }
  ' YourFile

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