awk - 如何获取包含某个字符串的行和包含另一个字符串的另一行之间的所有行加上之前的行

标签 awk

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

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
提前致谢。

最佳答案

仅在输入中存在 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

关于awk - 如何获取包含某个字符串的行和包含另一个字符串的另一行之间的所有行加上之前的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67077458/

相关文章:

linux - 如何在 Linux 中从一个文件中搜索字符串并更新到另一个文件

performance - AWK/GAWK 性能

linux - 在 bash 脚本中使用 curl 并获取 curl : (3) Illegal characters found in URL

awk - 将函数仅应用于一列,位置可变

linux - 如何使用 awk 去掉输出最后一列的字符?

Sed:模式后的复杂替换(在同一行)

python - 从文件中提取特定的行集

bash - 从当前目录获取文件并在同一行打印具有相同扩展名的文件

linux - 如何区分 $1 作为 shell 变量和 $1 作为 awk 变量?

bash - sed:如果与模式匹配,则打印分隔的行 block