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
- 从最后一个匹配行到最后一行打印文件(如果不匹配,则打印所有行):
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 }'