Vấn đề jq
cần một bộ lọc rõ ràng khi đầu ra được chuyển hướng được thảo luận trên tất cả các trang web. Nhưng tôi không thể chuyển hướng đầu ra nếu jq
là một phần của chuỗi ống, ngay cả khi sử dụng bộ lọc rõ ràng.
Xem xét:
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
Như mong đợi, đầu ra trong thiết bị đầu cuối ban đầu từ jq
lệnh là:
1
3
Nhưng nếu tôi thêm bất kỳ loại chuyển hướng hoặc đường ống nào vào cuối jq
lệnh, đầu ra sẽ im lặng:
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
Không có đầu ra xuất hiện trong thiết bị đầu cuối đầu tiên và out.txt trống.
Tôi đã thử hàng trăm biến thể nhưng đó là một vấn đề khó nắm bắt. Cách giải quyết duy nhất mà tôi đã tìm thấy , như được phát hiện thông qua mosquitto_sub
và Mạng điều (nơi tôi cũng đã phát hiện ra vấn đề), là bọc các hàm đuôi và hàm jq trong tập lệnh shell:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Sau đó:
./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
Và chắc chắn, đầu ra xuất hiện:
1
3
Đây là bản jq
cài đặt mới nhất qua 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
Đây có phải là một lỗi (phần lớn không có giấy tờ) trong jq
hoặc với sự hiểu biết của tôi về chuỗi ống?
tail -f logfile | grep 'foo bar' | awk ...
tail
bit đến từ những nỗ lực phá vỡ đường ống (chạy lệnh đầu tiên, tee và chuyển hướng đến tệp, nối đuôi, chuyển sang lệnh tiếp theo, chuyển hướng đến tệp, v.v.) và chạy liên tục trong các phần. Đây <
là một công cụ tốt để ghi nhớ mặc dù.
tail -f
để cung cấp đầu vào liên tục cho một chương trình vàtee
để xử lý đầu ra. Nếu bạn vẫn cần câu trả lời, tôi đã đề nghị đơn giản hóa chuỗi để<in.json jq '.f1' >out.json
bạn có thể thu hẹp những gì gây ra nó.