早上好,
我正在尝试为具有多个重复模式的文件编写 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