我正在尝试搜索文件中最后一次出现的模式,并删除包含最后一个模式的行之后的所有内容。我想知道它是否可能使用awk或sed。在此先感谢。
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr
期望的输出:
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
答案 0 :(得分:7)
tac
救援:
$ tac b | awk '/pattern/ {p=1}p' | tac
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
tac
会连接并反向打印文件。awk
代码。另一个例子:
$ cat a
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
aaaaaa pattern dddddd
qqqq eeee rrrr
$ tac a | awk '/pattern/ {p=1}p' | tac
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
aaaaaa pattern dddddd
答案 1 :(得分:2)
awk '
BEGIN { ARGV[ARGC++] = ARGV[ARGC-1] }
NR==FNR { if (/pattern/) lastLine = NR; next }
{ print }
FNR == lastLine { exit }
' file
要演示postfix如何在上面工作(请参阅下面的评论):
$ awk 'BEGIN{ i=3; a[i++] = i; for (j in a) print j, a[j]; print i }'
3 3
4
答案 2 :(得分:1)
我有这条线,应该符合您的要求:
awk '/pattern/{_=NR}{a[NR]=$0}END{for(i=1;i<=_;i++)print a[i]}' file
我做了一个小测试:
kent$ cat f
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr
aaaaaa pattern dddddd
111
222
kent$ awk '/pattern/{_=NR}{a[NR]=$0}END{for(i=1;i<=_;i++)print a[i]}' f
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr
aaaaaa pattern dddddd
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed -r '/pattern/{x;/./p;d};x;/./!{x;b};x;H;$!d;x;P;d' file