首页 > 解决方案 > 如何获取包含某个字符串的行和包含另一个字符串的另一行之间的所有行加上之前的行

问题描述

我花了一些时间在网上搜索,但没有找到答案。假设我有一个包含以下行的文件:

aaaaaaa
vvvvv
ggggg
yyyyyyyyy
ffffff
rrrrrrrr
uuuuu
ssssssssssss
zzzzz
hhhhhhhh

我知道如何使用 awk 查找从包含“ffffff”的行到包含“uuuuu”的所有行:

awk '/ffffff/,/uuuuu/' file

但是我怎样才能得到我发现的第一个行之前的行(即“yyyyyyyyy”)?有没有像 grep -B 1 这样的东西来做到这一点?我想要得到的是:

yyyyyyyyy
ffffff
rrrrrrrr
uuuuu

提前致谢。

标签: awk

解决方案


仅在输入中同时存在 ffffff 和 uuuuu 时打印,如果 ffffff 是输入中的第一行,则不打印空行:

$ cat tst.awk
/ffffff/ { f = 1 }
f {
    rec = rec $0 ORS
    if ( /uuuuu/ ) {
        printf "%s", rec
        f = 0
    }
    next
}
{ rec = $0 ORS }

$ awk -f tst.awk file
yyyyyyyyy
ffffff
rrrrrrrr
uuuuu

推荐阅读