jq
출력이 리디렉션 될 때 명시 적 필터 가 필요한 문제 는 웹 전체에서 논의됩니다. 그러나 jq
명시 적 필터를 사용하는 경우에도 파이프 체인의 일부인 경우 출력을 리디렉션 할 수 없습니다 .
치다:
touch in.txt
tail -f in.txt | jq '.f1'
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
예상 한대로 jq
명령 의 원래 터미널 출력 은 다음과 같습니다.
1
3
그러나 jq
명령 끝에 리디렉션 또는 파이핑을 추가 하면 출력이 자동으로 진행됩니다.
rm in.txt
touch in.txt
tail -f in.txt | jq '.f1' | tee out.txt
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
첫 번째 터미널에 출력이 나타나지 않고 out.txt가 비어 있습니다.
수백 가지 변형을 시도했지만 찾기 어려운 문제입니다. 은 내가 찾은 해결 을 통해 발견으로, mosquitto_sub
그리고 (나는 또한 문제가 발견 된 곳이었다)없는 것들 네트워크, 꼬리 래핑하는 것입니다 및 쉘 스크립트에서 JQ 기능 :
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
그때:
./tail_and_jq.sh | tee out.txt
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
그리고 충분히 출력이 나타납니다.
1
3
jq
Homebrew를 통해 최신 버전으로 설치되어 있습니다.
$ echo $SHELL
/bin/bash
$ jq --version
jq-1.5
$ brew install jq
Warning: jq 1.5_3 is already installed and up-to-date
이것은 jq
파이프 체인에 대한 이해와 관련 이 있거나 (문서화되지 않은) 버그 입니까?
tail -f logfile | grep 'foo bar' | awk ...
tail
에서 파이프를 분리 (첫 번째 명령 실행, 티 및 파일로 리디렉션, 테일, 파이프로 다음 명령으로 이동, 파일로 리디렉션 등)하려는 노력에서 비롯되었습니다. 는 <
하지만 염두에 두어야 할 수있는 좋은 도구입니다.
tail -f
에는 프로그램에 지속적인 입력을 제공tee
하고 출력을 처리하는 데 사용되는 상당히 (잘, 약간) 이상한 설정이 있습니다 . 여전히 대답이 필요한 경우 체인을 단순화하여<in.json jq '.f1' >out.json
원인을 좁힐 수 있습니다.