Linux 출력 리디렉션이 awk에서 작동하지 않습니다.

Linux 출력 리디렉션이 awk에서 작동하지 않습니다.

나는 상단의 일부 출력을 기반으로 멋진 csv 파일을 작성하려고 합니다. 다음과 같이 awk를 사용하여 출력을 다시 형식화합니다.

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }'

완벽하게 작동합니다. 이제 출력을 파일로 저장하고 싶습니다. 나는 다음을 사용하면 효과가 있다고 생각합니다 > output.log.

top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }' > output.log

그러나 최상위 프로세스에서 Ctrl-C를 누르면 빈 파일이 생성됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변1

Unix의 표준 I/O("stdio") 라이브러리는 어떤 종류의 것(데이터 싱크)에 쓰고 있는지 감지합니다. 터미널(즉, 창)을 감지하면 프로그램이 요청할 때 즉시 데이터를 씁니다. 그러나 파일에 쓸 때 I/O 라이브러리는 데이터를 버퍼링하고 한 번에 512(또는 그 이상) 바이트 블록에 씁니다. 물론 호출 프로그램이 종료될 때 버퍼를 플러시(부분 블록 작성)합니다. 즉, 완전히 종료되는 경우입니다. 비정상적인 종료( Ctrl+ 로 인한 C)로 인해 불완전한 출력 파일이 남을 수 있습니다.

문제를 해결하려면 다음을 시도해 보세요.

top -b | ( trap "" 2; nawk '(귀하의 nawk명령)' > output.log)`

이 명령은 명령이 + 에 영향을 받지 않게 trap만듭니다 . (물론 +는 여전히 프로세스를 종료하고 파이프에서 EOF(파일 끝)에 도달하면 (깨끗하게!) 종료됩니다.nawkCtrlCCtrlCtopnawk

PS 이는 실행 중이 bash거나 bash호환 가능한 쉘을 가정합니다(필요).

답변2

탑은 계속 달리고 있어요. 제한된 횟수만큼 실행하려고 합니다. -n 옵션을 사용하십시오. 이렇게:

top -b -n 1 | awk '{ ... }'

또는 C-\를 사용하여 top을 종료할 수도 있습니다. Cc를 사용하면 파이프가 중단되고 파이프가 조기에 중단됩니다(awk가 아무것도 가져오기 전에).

$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo

관련 정보