如何使用最接近具有特定图案的另一条线的图案打印线条?

时间:2010-08-10 12:31:49

标签: unix find awk grep

我想找到一个最接近特定图案的图案。比如我想在“yyyy:”下面打印“bbb =”(它是与bbb = yyyy最接近的行)。它是第8行。行号可能会更改,因此最好不要使用行号。

root#vi a
“a”15行

 1  ## xxxx:

 2  aaa=3

 3  bbb=4

 4  ccc=2

 5  ddd=1

 6  ## yyyy:

 7  aaa=1

 8  bbb=0

 9  ccc=3

10  ddd=3

11  ## zzzz:

12  aaa=1

13  bbb=1

14  ccc=1

15  ddd=1

您是否有为此目的使用awk或grep的想法?

2 个答案:

答案 0 :(得分:1)

这样的东西?

awk '/^## yyyy:/ { i = 1 }; i && /^bbb=/ { print; exit }'

或者上面的一行也可以匹配吗?在那种情况下,也许:

<击>

<击>
awk '/^bbb=/ && !i { p=NR; s=$0 }; /^bbb=/ && i { print (NR-i < i-p) ? $0 : s; exit }; /^## yyyy:/ { i=NR }'

<击>

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

/^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)
}

答案 1 :(得分:0)

使用grep

快速而肮脏
grep -A 100 '##yyyy' filename | grep 'bbb='