Vấn đề jqcầ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 jqlà 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ừ jqlệ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 jqlệ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_subvà 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 jqcà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 jqhoặc với sự hiểu biết của tôi về chuỗi ống?
tail -f logfile | grep 'foo bar' | awk ...
tailbit đế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.jsonbạn có thể thu hẹp những gì gây ra nó.