내 사용 사례는 다음과 같습니다. PHP에서 json 데이터만 기록하는 Apache 로그 파일이 있습니다. Apache가 로그를 인쇄하는 방식 때문에 awk를 사용하여 각 줄의 시작과 끝을 잘라야 합니다. 결과는 json 문자열이고 jq를 사용하여 예쁘게 인쇄하고 싶습니다.
tail에서 awk로 파이프하려면 stdbuf를 사용해야 합니다. 내가 생각해낸 전체 명령은 다음과 같습니다.
stdbuf -o0 tail -f -n 1 /var/log/apache2/error.log | awk '{print substr($0,83, length($0)- 166); }' | jq
이것은 작동하지 않습니다. 나는 그것이 jq 때문이라고 생각하지만 --stream 또는 --unbuffered도 작동하지 않습니다.
내가 원하는 것을 수행하는 방법을 아는 사람이 있습니까?
편집하다: JSON의 예는 다음과 같습니다.
{"foo": "bar"}
이는 올바르게 표시되지만 tail이 실행되는 동안 json이 작성되면 표시되지 않습니다.
답변1
방금 해결책을 찾았습니다. stdbuf -oO를 사용하여 각 명령을 "버퍼 해제"해야 합니다. 따라서 다음과 같아야 합니다.
stdbuf -o0 tail -f -n 2 /var/log/apache2/error.log | stdbuf -o0 awk '{print substr($0,83, length($0)- 166); }' | jq