获取最后一组非空行

获取最后一组非空行

我正在运行一个 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 -Pwith\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
'

相关内容