X 줄 뒤의 출력을 자르고 출력이 잘린 경우에만 메시지를 인쇄합니다.

X 줄 뒤의 출력을 자르고 출력이 잘린 경우에만 메시지를 인쇄합니다.

로깅 목적으로 출력의 처음 5줄만 필요하다고 가정해 보겠습니다. 또한 로그가 잘리는지 여부와 시기도 알아야 합니다.

head다음 명령을 사용하여 이 작업을 수행하려고 하는데 seq잘린 20줄을 출력 head하고 echo정보도 잘렸습니다.

 > seq -f 'log line %.0f' 20 | head -n 5 && echo '...Output truncated. Only showing first 5 lines...'
log line 1
log line 2
log line 3
log line 4
log line 5
...Output truncated. Only showing first 5 lines...

그러나 seq위와 동일한 구성을 사용하여 명령 출력이 5줄 미만인 경우 잘못된 "잘림" 상태가 표시됩니다.

seq -f ' log line %.0f' 3 | head -n 5 && echo '...Output truncated. Only showing first 5 lines...'
log line 1
log line 2
log line 3
...Output truncated. Only showing first 5 lines...

head필요할 때 "...truncated..." 메시지만 표시하도록 명령(또는 다른 도구)이 잘린 부분이 있는지 알려줄 수 있는 방법이 있습니까 ?

답변1

경고 지침:

이 작업을 수행할 때:

cmd | head

출력이 잘린 경우 cmd종료 후 더 많은 행을 쓰면 SIGPIPE에 의해 종료될 수 있습니다. head이것이 원하는 것이 아닌 경우 cmd출력이 삭제되더라도 그 이후에 계속 실행하려면 10줄의 출력 이후 종료하는 대신 나머지 줄을 읽고 삭제해야 합니다(예: 또는 로 교체 sed '1,10!d') .awk 'NR<=10'head

따라서 두 가지 다른 접근 방식의 경우:

출력이 잘리고 cmd가 종료될 수 있습니다.

cmd | awk 'NR>5 {print "TRUNCATED"; exit}; {print}'
cmd | sed  '6{s/.*/TRUNCATED/;q;}'

mawk해당 구현은 입력 처리를 시작하기 전에 awk버퍼 채우기 입력을 누적하므로 cmd버퍼 채우기(내 시스템 AFAICT에서는 8KiB) 데이터가 기록될 때까지 종료되지 않을 수 있습니다. 이 옵션을 사용하면 이 문제를 해결할 수 있습니다 -Winteractive.

일부 sed구현에서는 한 줄을 미리 읽어서(주소를 사용할 때 어떤 줄이 마지막인지 알 수 있도록 $) 이러한 구현의 경우 7번 줄이cmd 출력될 때까지 종료 되지 않을 수 있습니다.

출력이 잘리고 나머지는 폐기되므로 cmd가 종료되지 않습니다.

cmd | awk 'NR<=5; NR==6{print "TRUNCATED"}'
cmd | sed '1,6!d;6s/.*/TRUNCATED/'

답변2

AWK를 사용할 수 있습니다.

seq -f 'line %.0f' 20 | awk 'NR <= 5; NR > 5 { print "...Output truncated. Only showing first 5 lines..."; exit }'

그러면 처음 5개 라인(있는 경우)이 있는 그대로 인쇄됩니다. 그 이상의 라인이 있으면 잘림 메시지가 인쇄되고 종료됩니다.

조건부 처리를 구현하려면 사용할 종료 코드를 지정할 수 있습니다.

seq -f 'line %.0f' 20 | awk 'NR <= 5; NR > 5 { exit 1 }' || echo ...Output truncated. Only showing first 5 lines...

관련 정보