哪个简单快速的UNIX命令可以打印从最后一次出现的模式到文件末尾的所有行?
sed -n '/pattern/,$p' file
此sed命令从第一次出现开始打印。
答案 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;。