비어 있지 않은 줄의 마지막 세트를 가져옵니다.

비어 있지 않은 줄의 마지막 세트를 가져옵니다.

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\ZEOF가 아닌 EOL만 감지하는 것 같습니다 .

답변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
'

관련 정보