AWK를 사용하여 리디렉션할 수 없습니다.

AWK를 사용하여 리디렉션할 수 없습니다.

나는 사용하고 싶다AWK 리디렉션 기능지금까지 내가 한 일은 다음과 같습니다.

$ vmstat 1 | awk ' { print $2 > "outfile" } '

*실제로 이전 명령은 awk훨씬 더 복잡하지만 단순화된 데모일 뿐입니다.

리디렉션 없이 위 명령을 실행하면 표준 출력에서 ​​원하는 결과를 얻습니다. 그러나 다음으로 리디렉션한 후에도 outfile: ​​여전히 비어 있습니다.

$ cat outfile
$

이게 무슨 문제야?

티아.

답변1

awk출력을 버퍼링합니다. awk 구현이 이를 제공하는 경우(gawk, mawk 1 , nawk 및 BSD awk처럼) fflush().

  fflush([file])        Flush any buffers associated with the open output file 
                        or pipe file.  If file is missing or if it is  the null 
                        string,  then  flush  all open output files and pipes.

따라서 다음과 같이 작성하십시오.

vmstat 1 | awk '{print $2 > "outfile"; fflush()}'

GNU awk 수동 I/O 부분읽을 가치가 있습니다 fflush. 거기에서 당신도 찾을 수 있습니다fflush다음 POSIX 표준에 채택되었습니다..


또한 출력해야 하는 샘플 수를 제공할 수 있습니다 vmstat. 따라서 예를 들어 원하는 경우 5명령이 종료될 때까지 5초를 기다리면 파일에 출력이 포함됩니다.

vmstat 1 5 | awk '{print $2 > "outfile"}'

1 mawk의 구문은 약간 다릅니다: mawk -W interactive '{print $2 > "outfile"; fflush("")}'.

답변2

문제는 비활성화할 수 있는 버퍼링에 있습니다.

vmstat 1 | stdbuf -o0 awk '{print $2}' >> out
  • -o출력 스트림
  • 0스트림은 버퍼링되지 않습니다.

아니면 반복 vmstat해서 전화 할 수도 있습니다.whilesleep 1

while true; do 
     vmstat | awk '{print $2}' >> output.file
     sleep 1
done

관련 정보