空でない行の最後のセットを取得します。

空でない行の最後のセットを取得します。

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'空でない3行目のセットを取得し、末尾の改行も含めるため、この特別な場合にのみ機能します。
  • iostat -d 1 2 | tac | sed '1,/^$/d' | sed '/^$/q'やや良い方法は、最初のセットを裏返して印刷することです。ただし、iostat最後の出力は空白行なので、最初に削除してから、逆方向出力から次の空白行まで印刷します。他のコマンドは最後に複数行を出力する可能性があるため、これは一般的な回避策ではありません。元の順序を維持するには、逆の順に進んでください。
  • grep -P\ZEOFではなくEOLのみを検出しているようです。

答え1

使用できる段落モードawkです(RSが空の文字列の場合)。これにより、各「セット」がレコードになり、最後のレコードを簡単に印刷できます。

iostat -d 1 2 | awk -vRS= 'END{print}'

答え2

perl -00一度に1つの段落を読むのに最適な方法なので、最後の段落は次のようになります。

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
'

関連情報