打印最后一个匹配行
问题描述:
使用sed
,我想打印文件的最后一个匹配行。我碰到打印最后一个匹配行
sed: return last occurrence match until end of file
不过,我想只有匹配行本身,而不是行的任何范围。使用该页面其实我有一个工作指令
$ sed '/out_time=/h; $!d; x' progress.txt
out_time=00:00:07.720000
上来的问题是,为什么这个工作,或者换一种说法是什么这个命令怎么回事。还包括一个更简单的sed
命令(如果存在)。
答
这很简单,这些都是在每一行(循环)运行三个独立命令:
- 的
h
命令替换当前保持缓冲器用含有out_time=
每一行。 -
$!d
删除任何不是最后一行的行并重新启动下一个周期。 -
x
命令交换保持和模式缓冲区。
的效果是,最终out_time=
线被放置在保持缓冲器,并通过所述过滤器$!d
逸出的唯一线(该文件的最后一行)被交换与印刷之前保持缓冲器。
认为它是大意如下的程序:
grep 'out_time=' progress.txt | tail -1
:
for every line in file:
if line contains "out_time=":
holdbuff = line
if line is not last line of file:
continue for loop
swap line and holdbuff
print line
当然可以,如果你有合适的工具的工作来避免整个过程折磨
答
我想这可以被认为是简单的:
sed -n '/out_time=/h; ${x;p;}' progress.txt
也可写成:
sed -n '/out_time=/h; $x; $p' progress.txt
在所有这些,sed
只是持有保留空间匹配行,所以当它到达文件末尾时,它发现的最后一个匹配在保持空间中。此时,它将保持空间拉入图案空间,然后进行打印。