哪个是简单快速的UNIX命令来打印最后一次出现的模式中的所有行?

时间:2014-07-11 05:39:06

标签: perl unix awk sed

哪个简单快速的UNIX命令可以打印从最后一次出现的模式到文件末尾的所有行?

sed -n '/pattern/,$p' file

此sed命令从第一次出现开始打印。

7 个答案:

答案 0 :(得分:8)

这可能适合你(GNU sed):

sed 'H;/pattern/h;$!d;x;//!d' file

隐藏最后一个模式,并在保留空间中跟随行并在文件结尾处打印出来。

或者在awk中使用相同的方法:

awk '{x=x ORS $0};/pattern/{x=$0};END{if(x ~ //)print x}' file

然而在我的机器上,使用sed的jaypals方式似乎是最快的:

tac file | sed '/pattern/q' | tac

答案 1 :(得分:7)

反转文件,打印直到第一个模式,退出并反转文件。

tac file | awk '/pattern/{print;exit}1' | tac

答案 2 :(得分:2)

以下是Perlish的方法:

perl -ne '$seen = 1, @a = () if /pattern/; push @a, $_; END { print @a if $seen }' file

答案 3 :(得分:2)

最简单的解决方案就是在整个文件上使用正则表达式匹配:

perl -0777 -ne 'print $1 if /pattern(.*?)$/' file

答案 4 :(得分:1)

一个独立的awk:

awk '/pattern/{delete a;c=0}{a[c++]=$0}END{for (i=0;i<c;i++){print a[i]}}' file

答案 5 :(得分:0)

这是一个纯awk

awk 'FNR==NR {if ($0~/pattern/) f=FNR;next} FNR==f {a=1}a' file{,}

它读取文件两次,第一次为pattern的最后一次找到标记,然后打印表单pattern并输出。


或者您可以将数据存储在这样的数组中:

awk '/pattern/ {f=NR} {a[NR]=$0} END {for (i=f;i<=NR;i++) print a[i]}' file

答案 6 :(得分:0)

将GNU awk用于多字符RS和gensub():

$ awk -v RS='^$' -v ORS= '{print gensub(/.*(pattern)/,"\\1","")}' file

e.g:

$ cat file
a
b
c
b
d

$ awk -v RS='^$' -v ORS= '{print gensub(/.*(b)/,"\\1","")}' file
b
d

上述内容只是从文件的开头删除,直到最后一次出现&#34; b&#34;。