Awk
從最後一次出現的模式grep到另一個模式
早上好,
我正在嘗試為具有多個重複模式的文件編寫一個 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