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

Bash 如何grep线条图案的最后一次出现,bash,shell,awk,sed,grep,Bash,Shell,Awk,Sed,Grep,我有一个包含内容的文件 x a x b x c 我想把最后一件事说清楚 x c 当我尝试 sed -n "/x/,/b/p" file 它列出了所有行,从x到c不确定如何使用sed执行,但您可以尝试awk awk '{a=a"\n"$0; if ($0 == "x"){ a=$0}} END{print a}' file 我不确定我是否正确回答了你的问题,所以这里有一些在黑暗中拍摄的照片: 打印上次出现的x(正则表达式): 或者: tac file | grep -m1 x

我有一个包含内容的文件

x
a
x
b
x
c
我想把最后一件事说清楚

x
c
当我尝试

sed -n  "/x/,/b/p" file

它列出了所有行,从
x
c
不确定如何使用
sed
执行,但您可以尝试
awk

awk '{a=a"\n"$0; if ($0 == "x"){ a=$0}}  END{print a}' file

我不确定我是否正确回答了你的问题,所以这里有一些在黑暗中拍摄的照片:

  • 打印上次出现的
    x
    (正则表达式):

  • 或者:

    tac file | grep -m1 x
    
  • 将文件从第一个匹配行打印到最后:

    awk '/x/{flag = 1}; flag' file
    
  • 从最后一个匹配行到最后一行打印文件(如果不匹配,则打印所有行):

这可能适合您(GNU-sed):

保存最后一个
x
以及保留空间中的内容,并在文件末尾打印出来

grep -A 1 x file | tail -n 2
-A 1
告诉grep在匹配行后打印一行
使用
tail
可以得到最后两行

或者以相反的方式:

tac fail | grep -B 1 x -m1 | tac
注意:你应该确保你的图案足够“牢固”,这样你就能得到正确的线条。i、 e.在开头用
^
封起来,在结尾用
$
封起来。

POSIX vi(或ex或ed),以防对某人有用

当然是在命令模式下完成的

:设置wrapscan

转到第一行,然后向后搜索!
1G?图案

慢行方式,无
:设置wrapscan

G$?模式

说明:

G
转到最后一行

移动到该行的末尾
$

向后搜索
模式

第一场向后的比赛将与最后一场向前的比赛相同

无论哪种方式,您现在都可以删除当前(匹配)上方的所有行

:1、-1d

kd1G

如果同一行上有多个匹配项,也可以使用
d0
在删除行之前删除到匹配行的开头

POSIX awk,如


awk'(FNR==1)和&s{print s;s=“”}/PATTERN/{s=$0}END{if(s)print s}'

如果你想以一行程序的方式完成awk,但是让awk更接近函数式编程范例语法,而不必跟踪最后一次出现的时间

mawk/mawk2/gawk 'BEGIN { FS = "=7713[0-9]+="; RS = "^$";

 } END { print ar0[split($(0 * sub(/\n.+$/,"",$NF)), ar0, ORS)] }'
在这里,我使用多个awk短手:

    sub(/[\n.+$/, "", $NF) # trimming all extra rows after pattern
g/sub()

split()

这就是为什么这段代码看起来像是在定义数组本身之前提取数组项,但由于需要逻辑流,数组在到达print时将被定义

现在如果你想要更简单的东西,这两个也可以

mawk/gawk 'BEGIN { FS="=7713[0-9]+="; RS = "^$" 

   } END { $NF = substr($NF, 1, index($NF, ORS)); 
           
           FS = ORS; $0 = $0; print $(NF-1) }'

  • 我没有使用与OP相同的
    x | c
    要求来展示这些工作,无论您需要固定字符串还是基于正则表达式的匹配

那么您想从最后一行打印到最后一行吗?据我所知,sed分别处理每一行。(“您给它的命令依次在每一行输入上运行”-引自)这个
awk”/x/{flag=1};{if(flag==1)print;}”txt
可以写得更简单一些,比如
awk'/x/{flag=1}flag'txt
,使用
tac
来方便地获取最后一个实例是非常巧妙的!谢谢你在awk语句中使用“or”时要小心。我在否定方面遇到了麻烦!-我得到了一个错误“awk:cmd”。行:1^反斜杠不是最后一个字符-因为我认为我必须使用\!,但是使用'可以防止这种情况。另外,/x/是一个正则表达式,您需要知道正则表达式中使用的字符,需要转义。幸运的是,我可以更改我必须搜索的文件中的字符串,这使正则表达式变得更容易。注意:
tac
需要GNU实用程序。
mawk/mawk2/gawk 'BEGIN { FS = "=7713[0-9]+="; RS = "^$";

 } END { print ar0[split($(0 * sub(/\n.+$/,"",$NF)), ar0, ORS)] }'
    sub(/[\n.+$/, "", $NF) # trimming all extra rows after pattern
mawk/gawk 'BEGIN { FS="=7713[0-9]+="; RS = "^$" 

   } END { $NF = substr($NF, 1, index($NF, ORS)); 
           
           FS = ORS; $0 = $0; print $(NF-1) }'
mawk/gawk '/=7713[0-9]+=/ { lst = $0 } END { print lst }'