나는 사용하고 싶다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
해서 전화 할 수도 있습니다.while
sleep 1
while true; do
vmstat | awk '{print $2}' >> output.file
sleep 1
done