我正在运行一个 cron 作业,它应该只得到iostat -d 1 2
.这需要一些解析:什么是获得最简单的方法最后一组非空行如果每组的长度未知,从标准输入到标准输出?
坏/不起作用的解决方案:
tail
因为我仍然需要计算最后一组中的行数。iostat -d 1 2 | tail -$(echo "$(iostat -d 1 2 | wc -l) / 2" | bc)
取决于相同的集合大小。split
/csplit
因为它们输出到文件,并保留数据的无用部分。iostat -d 1 2 | sed '1,/^$/d' | sed '1,/^$/d'
仅在这种特殊情况下有效,因为它获取第三组非空行,但也包括任何尾随换行符。iostat -d 1 2 | tac | sed '1,/^$/d' | sed '/^$/q'
一个稍微好一点的技巧是:反转并打印第一组。然而,由于iostat
最后输出一个空行,我们首先删除它,然后打印直到反向输出中的下一个空行。其他命令可能会在末尾输出任意数量的换行符,因此这不是通用的解决方案。如果要保持原来的顺序,请再次反转。grep -P
with\Z
似乎只检测 EOL,而不检测 EOF。
答案1
您可以使用awk
的段落模式(当 RS 为空字符串时)。这样,每个“集合”就是一个记录,您可以轻松打印最后一个记录。
iostat -d 1 2 | awk -vRS= 'END{print}'
答案2
perl -00
是一次阅读一段的好方法,所以最后一段是:
perl -00 -ne '$para = $_; END {print $para}'
答案3
和sed
:
sed '/^$/{$!{N;/\n$/D;s/.//;$!h;$p;d};};//!{H;1h;$!d};$x' infile
这应该打印最后一组非空行,没有任何前导/尾随空行。
例如
iostat -d 1 2 | sed '/^$/{ # if the line is empty
$!{ # and if it's not the last line
N # then pull in the next line
/\n$/D # if also empty, delete up to \n, restart cycle
s/.// # otherwise delete leading \newline
$!h # copy over hold space if not last line
$p # or print pattern space if last line
d # then delete pattern space
}
}
//!{ # if the line isn't empty
H # append it to hold space
1h # if it's the first line, overwrite hold space
$!d # if it's not the last line, delete it
}
$x # on the last line, exchange buffers
'