Unix 如何打印与另一个具有特定图案的行最近的图案行?

Unix 如何打印与另一个具有特定图案的行最近的图案行?,unix,find,awk,grep,Unix,Find,Awk,Grep,我想找到一个最接近某个特定图案的图案。例如,我想打印“yyyy:”下的“bbb=”(这是bbb=到yyyy最近的一行)。是8号线。行号和顺序可能会更改,因此最好不要使用行号 根#vi a “a”15行 你有没有想过使用awk或grep来达到这个目的 像这样的 awk '/^## yyyy:/ { i = 1 }; i && /^bbb=/ { print; exit }' 或者上面的一行也可以匹配吗?在这种情况下,或许: awk'/^bbb=/&&!i{p=NR;s=0}/^

我想找到一个最接近某个特定图案的图案。例如,我想打印“yyyy:”下的“bbb=”(这是bbb=到yyyy最近的一行)。是8号线。行号和顺序可能会更改,因此最好不要使用行号

根#vi a
“a”15行

你有没有想过使用awk或grep来达到这个目的

像这样的

awk '/^## yyyy:/ { i = 1 }; i && /^bbb=/ { print; exit }'
或者上面的一行也可以匹配吗?在这种情况下,或许:

awk'/^bbb=/&&!i{p=NR;s=0}/^bbb=/&i{print(NR-i

考虑到可能没有上一个或下一个条目:

/^bbb=/ && !i { p1 = NR; s1 = $0 }
/^bbb=/ &&  i { p2 = NR; s2 = $0; exit }
/^## yyyy:/ { i = NR }
END {
    if (p1 == 0)
        print s2
    else if (p2 == 0)
        print s1
    else
        print (i - p1 < p2 - i ? s1 : s2)
}
/^bbb=/&&!i{p1=NR;s1=0}
/^bbb=/&i{p2=NR;s2=$0;exit}
/^##yyyy:/{i=NR}
结束{
如果(p1==0)
打印s2
else如果(p2==0)
打印s1
其他的
打印(i-p1
使用
grep
快速且肮脏:

grep -A 100 '##yyyy' filename | grep 'bbb='
如果不清楚什么是“最接近的模式”,这不是一个真正的问题。。。
/^bbb=/ && !i { p1 = NR; s1 = $0 }
/^bbb=/ &&  i { p2 = NR; s2 = $0; exit }
/^## yyyy:/ { i = NR }
END {
    if (p1 == 0)
        print s2
    else if (p2 == 0)
        print s1
    else
        print (i - p1 < p2 - i ? s1 : s2)
}
grep -A 100 '##yyyy' filename | grep 'bbb='