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为空。
我已经尝试了数百种变体,但这是一个难以捉摸的问题。通过The Things Network(也是我发现问题的地方)发现的,我发现的唯一解决方法mosquitto_sub
是将tail 和 jq函数包装在shell脚本中:
#!/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
您将链接简化为,以便缩小导致问题的范围。