로깅 목적으로 출력의 처음 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...