Grep 从最后一次出现的模式到另一个模式

Grep 从最后一次出现的模式到另一个模式

早上好,

我正在尝试为具有多个重复模式的文件编写 UNIX 脚本,后跟我要查找的模式。这个问题非常类似于:

获取一个模式在另一个模式之前最后一次出现的情况但是我没有“tac”(或“tail -r”),并且希望返回 String2 和 String2 之前最后一次出现的 String1。

输出:

...
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,但我的环境中没有 tac 命令(或 tail -r)。

想知道是否有人有任何建议,将不胜感激。感谢您提前抽出时间并提供帮助。

答案1

好吧,如果grep不能正常工作,则不确定是否awk可以,但您可以尝试以下操作:

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

答案2

基于替代条件的更通用用途(并不总是在循环 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

相关内容