如何grep最后一次出现的线条图案

use*_*858 13 bash shell awk grep sed

我有一个包含内容的文件,

x
a
x
b
x
c
Run Code Online (Sandbox Code Playgroud)

我想grep最后一次出现,

x
c
Run Code Online (Sandbox Code Playgroud)

当我尝试

sed -n  "/x/,/b/p" file
Run Code Online (Sandbox Code Playgroud)

它列出了所有的行.从x到c开始

ste*_*fen 34

我不确定我的问题是否正确,所以这里有一些黑暗的镜头:

  • 这个 `awk "/x/ { flag = 1 }; { if (flag == 1) print; }" txt` 可以写得更简单,比如 `awk '/x/ {flag=1} flag' txt` (2认同)

eli*_*lig 7

grep -A 1 x file | tail -n 2
Run Code Online (Sandbox Code Playgroud)

-A 1告诉 grep 在匹配行之后打印一行,
tail获得最后两行。

或以相反的方式:

tac fail | grep -B 1 x -m1 | tac
Run Code Online (Sandbox Code Playgroud)

注意:您应该确保您的模式足够“强大”,以便为您提供正确的线条。即通过^在开始和$结束时将其括起来。


ray*_*ray 1

不知道如何使用sed,但你可以尝试awk

awk '{a=a"\n"$0; if ($0 == "x"){ a=$0}}  END{print a}' file
Run Code Online (Sandbox Code Playgroud)